home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-06-17 | 62.7 KB | 4,633 lines |
-
- SP EQU 1
- SPM EQU 1
- BS EQU 1
- BP EQU 1
- SH EQU 1
- PH EQU 1
- MB EQU 0
- ScreenWidth EQU 320
-
- LARGESCREEN equ 0
-
-
- * the 'Hello World' program in 68000 Assembler
- * the C version can be found in the Intuition manual
-
- * this source code (C) HiSoft 1992 All Rights Reserved
-
- * for Devpac Amiga Version 2 the following symbols were changed
- * to avoid clashes with the new include files:
- * Screen->MyScreen, NewScreen->MyNewScreen
- * Window->MyWindow, NewWindow->MyNewWindow
-
- opt c+,d+
-
- include workbench:utilities/devpac/system use pre-assembled header
- include exec/exec_lib.i
- include intuition/intuition.i
- include intuition/intuition_lib.i
- include graphics/graphics_lib.i
- include graphics/text.i
-
- INTUITION_REV equ 31 v1.1
- GRAPHICS_REV equ 31 v1.1
-
- * Open the intuition library
-
- moveq #100,d4 default error return code
-
- moveq #INTUITION_REV,d0 version
- lea int_name(pc),a1
- CALLEXEC OpenLibrary
- tst.l d0
- beq exit_false if failed then quit
- move.l d0,_IntuitionBase else save the pointer
-
- moveq #GRAPHICS_REV,d0
- lea graf_name(pc),a1
- CALLEXEC OpenLibrary
- tst.l d0
- ; beq exit_closeint if failed then close Int, exit
- move.l d0,_GfxBase
- lea MyNewScreen(pc),a0
- CALLINT OpenScreen open a screen
- tst.l d0
- ; beq exit_closeall if failed the close both, exit
- move.l d0,MyScreen
-
- move.l MyScreen,a0
- lea sc_BitMap(a0),a0
- lea bm_Planes(a0),a0
-
-
- move.l #RAWSCRN,(a0)
- move.l #RAWSCRN+10240,4(a0)
- move.l #RAWSCRN+10240*2,8(a0)
- move.l #RAWSCRN+10240*3,12(a0)
- move.l #RAWSCRN+10240*4,16(a0)
- move.l #RAWSCRN+10240*5,20(a0)
- move.l #RAWSCRN+10240*6,24(a0)
- move.l #RAWSCRN+10240*7,28(a0)
-
- * now initialise a NewWindow structure. This is normally easier to
- * do with dc.w/dc.l statement etc, but for comparison with the C
- * version we do it like this
- lea MyNewWindow(pc),a0 good place to start
- move.w #20,nw_LeftEdge(a0)
- move.w #20,nw_TopEdge(a0)
- move.w #300,nw_Width(a0)
- move.w #100,nw_Height(a0)
- move.b #0,nw_DetailPen(a0)
- move.b #1,nw_BlockPen(a0)
- move.l #window_title,nw_Title(a0)
- _temp set WINDOWCLOSE!SMART_REFRESH!ACTIVATE!WINDOWSIZING
- move.l #_temp!WINDOWDRAG!WINDOWDEPTH,nw_Flags(a0)
- move.l #CLOSEWINDOW,nw_IDCMPFlags(a0)
- move.w #CUSTOMSCREEN,nw_Type(a0)
- clr.l nw_FirstGadget(a0)
- clr.l nw_CheckMark(a0)
- move.l MyScreen(pc),nw_Screen(a0)
- clr.l nw_BitMap(a0)
- move.w #100,nw_MinWidth(a0)
- move.w #25,nw_MinHeight(a0)
- move.w #640,nw_MaxWidth(a0)
- move.w #200,nw_MaxHeight(a0)
-
- * thats it set up, now open the window (a0=NewWindow already)
- ; CALLINT OpenWindow
- ; tst.l d0
- ; beq exit_closescr if failed
- ; move.l d0,MyWindow save it
- ;
- ; move.l d0,a1 window
- ; move.l wd_RPort(a1),a1 rastport
- ; moveq #20,d0 X
- ; moveq #20,d1 Y
- ; CALLGRAF Move move the cursor
- ;
- ; move.l MyWindow(pc),a0
- ; move.l wd_RPort(a0),a1 rastport
- ; lea hello_message(pc),a0
- ; moveq #11,d0
- ; CALLGRAF Text print something
- ;
- ; move.l MyWindow(pc),a0
- ; move.l wd_UserPort(a0),a0
- ; move.b MP_SIGBIT(a0),d1 (misprint in manual)
- ; moveq #0,d0
- ; bset d1,d0 do a shift
- ; CALLEXEC Wait
-
- ; moveq #0,d4 return code
-
- * various exit routines that do tidying up, given a return code in d4
-
- ; move.l MyWindow(pc),a0
- ; CALLINT CloseWindow
-
- ;exit_closescr
- ; move.l MyScreen(pc),a0
- ; CALLINT CloseScreen
-
- ;exit_closeall
- ; move.l _GfxBase(pc),a1
- ; CALLEXEC CloseLibrary
-
- ;exit_closeint
- ; move.l _IntuitionBase(pc),a1
- ; CALLEXEC CloseLibrary
-
- ;done:
- ; bra done
-
- SPECULAR EQU SP
- SPECMAP EQU SPM
- BUMPSPEC EQU BS
- BUMPPHONG EQU BP
- SHADOWMAP EQU SH
- SHADING EQU PH
- MOTIONBLUR EQU MB
-
-
- move.l #PALETTEBIT,a0
- move.l #COPIEDPAL+4,a1
- move.w #255,d0
-
- copydown:
- move.b 1(a0),(a1)
- move.b 3(a0),4(a1)
- move.b 5(a0),8(a1)
- add.w #6,a0
- add.w #12,a1
- dbra d0,copydown
-
- move.w #256,COPIEDPAL
- move.w #0,COPIEDPAL+2
- LOOKFORME:
- move.l MyScreen,a0
- lea sc_ViewPort(a0),a0
- move.l #COPIEDPAL,a1
- move.l _GfxBase,a6
- jsr -$372(a6)
-
- move.l MyScreen,a4
- move.w sc_MouseX(a4),d0
- move.w sc_MouseY(a4),d1
- move.w d0,OLDXM
- move.w d1,OLDYM
-
- move.l 4.w,a6
- move.l #doslibname,a1
- moveq #0,d0
- jsr -552(a6)
- move.l d0,doslib
-
- move.l doslib,a6
- move.l #OBJNAME,d1
- move.l #1005,d2
- jsr -30(a6)
- move.l d0,ROTATEDPTS
-
- move.l doslib,a6
- move.l d0,d1
- move.l #POLYGONDATA,d2
- move.l #30000,d3
- jsr -42(a6)
-
- move.l doslib,a6
- move.l ROTATEDPTS,d1
- jsr -36(a6)
-
- loop:
-
- move.w #0,temp
-
- move.l #POLYGONDATA,a3
- move.w (a3)+,SORTIT
- move.l a3,START_OF_OBJECT
-
- move.w (a3)+,num_points
- move.w (a3)+,d6
- move.w d6,num_frames
- move.l a3,POINTER_TO_POINTERS
- lea (a3,d6.w*4),a3
- move.l a3,LinesPtr
- moveq #0,d5
- moveq #0,d2
-
- move.l POINTER_TO_POINTERS,a4
- move.w (a4,d5.w*4),d2
- add.l START_OF_OBJECT,d2
- move.l d2,PtsPtr
- move.w 2(a4,d5.w*4),d5
- add.l START_OF_OBJECT,d5
- move.l d5,PolyAngPtr
- move.l d2,a3
- move.w num_points,d5
-
- move.l (a3)+,OBJONOFF
-
- move.l a3,PointAngPtr
- add.w d5,d5
- move.w d5,d2
- add.w d5,d5
- add.w d5,d2
- add.w d2,a3
- move.l a3,PtsPtr
-
- move.l MyScreen,a4
- move.w sc_MouseX(a4),d0
- move.w sc_MouseY(a4),d1
-
- sub.w OLDXM,d0
- sub.w OLDYM,d1
- add.w d0,OLDXM
- add.w d1,OLDYM
-
- btst #6,$bfe001
- beq.s .SHIFTABOUT
-
- muls #8190,d0
- divs #320,d0
- add.w d0,YANG
- and.w #8190,YANG
- muls #8190,d1
- divs #320,d1
- and.w #8190,d1
- add.w d1,XANG
- and.w #8190,XANG
-
- ; add.w #40,AANG
- ; add.w #70,BANG
- ; and.w #8191,AANG
- ; and.w #8191,BANG
-
- ; add.w #60,CANG
- ; add.w #90,DANG
- ; and.w #8191,CANG
- ; and.w #8191,DANG
-
-
- bra .ROTABOUT
- .SHIFTABOUT
-
- muls #8190,d0
- divs #320,d0
- add.w d0,BANG
- and.w #8190,BANG
- muls #8190,d1
- divs #320,d1
- and.w #8190,d1
- add.w d1,AANG
- and.w #8190,AANG
-
-
- .ROTABOUT
-
- move.w AANG,d1
- move.w BANG,d3
- ; cmp.w #2,d6
- ; bne.s .notsecrot
- ; move.w CANG,d1
- ; move.w DANG,d3
- ;.notsecrot
- move.l #SINETABLE,a1
- move.w (a1,d1.w),XSIN ;xsin
- move.w (a1,d3.w),YSIN ;ysin
-
- add.w #2048,a1
- move.w (a1,d1.w),XCOS ;xcos
- move.w (a1,d3.w),YCOS ;ycos
-
- move.w XANG,d1
- move.w YANG,d3
- ; cmp.w #2,d6
- ; bne.s .notsecrot
- ; move.w CANG,d1
- ; move.w DANG,d3
- ;.notsecrot
- move.l #SINETABLE,a1
- move.w (a1,d1.w),XSIN2 ;xsin
- move.w (a1,d3.w),YSIN2 ;ysin
-
- add.w #2048,a1
- move.w (a1,d1.w),XCOS2 ;xcos
- move.w (a1,d3.w),YCOS2 ;ycos
-
-
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
-
- *SHADOW BUFFER CALCULATION
-
-
- ; First, calculate the normal brightnesses
- ; for points. NB: -1,-1,-1 = this point not used
- ; in gouraud shading.
-
- move.l #NORMBRIGHTS,a2
- move.l PointAngPtr,a0
- move.w num_points,d7
-
- move.l #NORMVECTS,a5
-
- subq #1,d7
-
- CALCNORMBRIGHTS:
-
- move.w (a0)+,d0
- move.w (a0)+,d1
- move.w (a0)+,d2
-
- move.w #0,d6
-
- cmp.w #-1,d0
- bne.s .notnot
- cmp.w #-1,d1
- bne.s .notnot
- cmp.w #-1,d2
- bne.s .notnot
-
- move.w #-1,x1
- move.w #-1,y1
- move.w #-1,z1
- bra .dontbother
-
- .notnot:
- neg.w d1
-
- move.w d0,d3
- move.w d2,d5
-
- muls YCOS,d0
- muls YSIN,d2
- sub.l d2,d0
- add.l d0,d0
- swap d0
- ; asr.l #6,d0 ; new x*512
-
- muls YSIN,d3
- muls YCOS,d5
- add.l d5,d3
- add.l d3,d3
- swap d3
- move.w d3,d2 ; new z
-
- move.w d1,d4
- move.w d2,d5
- muls XCOS,d1
- muls XSIN,d2
- sub.l d2,d1
- add.l d1,d1
- swap d1
-
- muls XSIN,d4
- muls XCOS,d5
- add.l d5,d4
- add.l d4,d4
- swap d4
- move.w d4,d2 ; new z
-
-
- move.w d0,d3
- move.w d2,d5
-
- muls YCOS2,d0
- muls YSIN2,d2
- sub.l d2,d0
- add.l d0,d0
- swap d0
-
- muls YSIN2,d3
- muls YCOS2,d5
- add.l d5,d3
- add.l d3,d3
- swap d3
- move.w d3,d2 ; new z
-
- move.w d1,d4
- move.w d2,d5
- muls XCOS2,d1
- muls XSIN2,d2
- sub.l d2,d1
- add.l d1,d1
- swap d1
-
- muls XSIN2,d4
- muls XCOS2,d5
- add.l d5,d4
- add.l d4,d4
- swap d4
-
- move.w d0,x1
- move.w d1,y1
- move.w d4,z1
-
- tst.w y1
- blt.s .okpos
-
- move.w x1,d1 ; 0-1024
- asr.w #4,d1 ; 0-64
- move.w z1,d2 ; 0-1024
- asr.w #4,d2 ; 0-64
-
- muls d1,d1
- muls d2,d2
- add.l d1,d2
- jsr CALCSQROOT
- tst.w d2
- beq.s .okpos
-
- move.w d2,d3 ; 0-64
- neg.w d3
- add.w #127,d3 ; 64-127
-
- move.w z1,d4
- muls d3,d4
- divs d2,d4
-
- move.w x1,d0
- muls d3,d0
- divs d2,d0
-
- ; asr.w #1,d4
- ; asr.w #1,d0
-
- ; neg.w y3
-
- .okpos
-
- asr.w #4,d4
- add.w #128,d4
- move.b d4,d6
- lsl.w #8,d6
- asr.w #4,d0
- add.w #128,d0
- move.b d0,d6
-
- ; move.w d1,d6 ; new y
- ;
- ; asr.w #4,d6
- ; add.w #20,d6
- ;
- ; ble.s .okokok
- ;
- ; moveq #0,d6
- ;
- ;.okokok:
- ; add.w #$1c,d6
- ; cmp.w #1,d6
- ; bge.s .okokokok
- ; moveq #1,d6
- ;.okokokok:
-
- ; add.w #64,d6
- ;
- ; cmp.w #28,d6
- ; blt.s .okbig
- ; move.w #28,d6
- ;.okbig
-
- .dontbother:
- move.w x1,(a5)+
- move.w y1,(a5)+
- move.w z1,(a5)+
- move.w d6,(a2)+
-
- dbra d7,CALCNORMBRIGHTS
-
-
- ; Next, calculate the point coords for
- ; the shadow buffer.
-
- move.l #SHADOWPTS,a2
- move.l PtsPtr,a0
- move.w num_points,d7
- subq #1,d7
-
- ROTPTLOPSHAD:
- move.w (a0)+,d0
- move.w d0,d3
- move.w (a0)+,d1
- move.w (a0)+,d2
- move.w d2,d5
-
- muls YCOS,d0
- muls YSIN,d2
- sub.l d2,d0
- add.l d0,d0
- swap d0
- ; asr.l #6,d0 ; new x*512
-
- muls YSIN,d3
- muls YCOS,d5
- add.l d5,d3
- add.l d3,d3
- swap d3
- move.w d3,d2 ; new z
-
- move.w d1,d4
- move.w d2,d5
- muls XCOS,d1
- muls XSIN,d2
- sub.l d2,d1
- add.l d1,d1
- swap d1
-
- muls XSIN,d4
- muls XCOS,d5
- add.l d5,d4
- add.l d4,d4
- swap d4
- move.w d4,d2 ; new z
-
- move.w d0,d3
- move.w d2,d5
-
- muls YCOS2,d0
- muls YSIN2,d2
- sub.l d2,d0
- asr.l #6,d0 ; new x*512
-
- muls YSIN2,d3
- muls YCOS2,d5
- add.l d5,d3
- add.l d3,d3
- swap d3
- move.w d3,d2 ; new z
-
- move.w d1,d4
- move.w d2,d5
- muls XCOS2,d1
- muls XSIN2,d2
- sub.l d2,d1
- asr.l #6,d1 ; new y*512
-
- muls XSIN2,d4
- muls XCOS2,d5
- add.l d5,d4
- add.l d4,d4
- swap d4
- move.w d4,d2 ; new z
-
- ext.l d2
-
- move.w XOFF,d5
- ext.l d5
- asl.l #8,d5
- add.l d5,d5
- add.l d5,d0
-
- move.l d0,(a2)+
- move.l d1,(a2)+
- move.w d2,(a2)+
-
- dbra d7,ROTPTLOPSHAD
-
-
-
- ***************************************
- * Calculate viewer position for specularity..
-
- move.w #0,d0
- move.w #0,d1
- move.w #-1024,d2
-
- ; move.w d0,d3
- ; move.w d2,d5
- ;
- ; muls YCOS,d0
- ; muls YSIN,d2
- ; sub.l d2,d0
- ; add.l d0,d0
- ; swap d0
- ; asr.l #6,d0 ; new x*512
- ;
- ; muls YSIN,d3
- ; muls YCOS,d5
- ; add.l d5,d3
- ; add.l d3,d3
- ; swap d3
- ; move.w d3,d2 ; new z
- ;
- ; move.w d1,d4
- ; move.w d2,d5
- ; muls XCOS,d1
- ; muls XSIN,d2
- ; sub.l d2,d1
- ; add.l d1,d1
- ; swap d1
- ;
- ; muls XSIN,d4
- ; muls XCOS,d5
- ; add.l d5,d4
- ; add.l d4,d4
- ; swap d4
- ; move.w d4,d2 ; new z
-
- move.w d0,d3
- move.w d2,d5
-
- muls YCOS2,d0
- muls YSIN2,d2
- sub.l d2,d0
- add.l d0,d0
- swap d0
-
- muls YSIN2,d3
- muls YCOS2,d5
- add.l d5,d3
- add.l d3,d3
- swap d3
- move.w d3,d2 ; new z
-
- move.w d1,d4
- move.w d2,d5
- muls XCOS2,d1
- muls XSIN2,d2
- sub.l d2,d1
- add.l d1,d1
- swap d1
- ; asr.l #6,d1 ; new y*512
-
- muls XSIN2,d4
- muls XCOS2,d5
- add.l d5,d4
- add.l d4,d4
- swap d4
-
- move.w d0,x2b
- move.w d1,y2b
- move.w d4,z2b
-
- ; Now the specular highlight efforts....
-
- move.l #SPECBRIGHTS,a2
- move.l #NORMVECTS,a1
-
- move.l #SHADOWPTS,a5
-
- move.w num_points,d7
- subq #1,d7
-
- CALCSPECBRIGHTS:
-
- move.w (a1)+,x1
- move.w (a1)+,y1
- move.w (a1)+,z1
-
- move.w x2b,d0
- move.l (a5)+,d1
- asr.l #8,d1
- asr.l #1,d1
- sub.w d1,d0
- move.w d0,x2
- move.w y2b,d0
- move.l (a5)+,d1
- asr.l #8,d1
- asr.l #1,d1
- sub.w d1,d0
- move.w d0,y2
- move.w z2b,d0
- sub.w (a5)+,d0
- move.w d0,z2
-
- move.w #0,d6
-
- cmp.w #-1,x1
- bne.s .notnot
- cmp.w #-1,y1
- bne.s .notnot
- cmp.w #-1,z1
- beq .dontbother
- .notnot:
-
- move.w x2,d2
- muls d2,d2
- move.w y2,d1
- muls d1,d1
- add.l d1,d2
- move.w z2,d1
- muls d1,d1
- add.l d1,d2
-
- jsr CALCSQROOT
-
- move.w d2,l2
-
- move.w y1,d0
- muls z2,d0
- move.w y2,d1
- muls z1,d1
- sub.l d1,d0 ; x4
-
- move.w z1,d1
- muls x2,d1
- move.w z2,d2
- muls x1,d2
- sub.l d2,d1 ; y4
-
- move.w x1,d2
- muls y2,d2
- move.w x2,d3
- muls y1,d3
- sub.l d3,d2 ; z4
-
- asr.l #8,d0
- asr.l #8,d1
- asr.l #8,d2
- asr.l #2,d0
- asr.l #2,d1
- asr.l #2,d2
-
- move.w x1,d3
- muls d1,d3
- move.w y1,d4
- muls d0,d4
- sub.l d4,d3
- asr.l #8,d3
- asr.l #1,d3
- add.w z2,d3
-
- muls #1024,d3
- divs l2,d3
-
- move.w d3,z3
-
- move.w y1,d3
- muls d2,d3
- move.w z1,d4
- muls d1,d4
- sub.l d4,d3
- asr.l #8,d3
- asr.l #1,d3
- add.w x2,d3
- muls #1024,d3
- divs l2,d3
-
- move.w d3,x3
-
- move.w z1,d3
- muls d0,d3
- move.w x1,d4
- muls d2,d4
- sub.l d4,d3
- asr.l #8,d3
- asr.l #1,d3
- add.w y2,d3
- muls #1024,d3
- divs l2,d3
-
- move.w d3,y3
-
- move.w z3,d3
- asr.w #4,d3
- add.w #128,d3
-
- move.b d3,d6
- lsl.w #8,d6
-
- move.w x3,d3
- asr.w #4,d3
- add.w #128,d3
- move.b d3,d6
-
- tst.w y3
- blt.s .okpos
-
- move.w x3,d1
- asr.w #4,d1
- move.w z3,d2
- asr.w #4,d2
-
- muls d1,d1
- muls d2,d2
- add.l d1,d2
- jsr CALCSQROOT
- tst.w d2
- beq.s .okpos
-
- move.w d2,d3
- neg.w d3
- add.w #127,d3
-
- move.w z3,d4
- muls d3,d4
- divs d2,d4
- asr.w #4,d4
- add.w #128,d4
- move.b d4,d6
- lsl.w #8,d6
-
- move.w x3,d4
- muls d3,d4
- divs d2,d4
- asr.w #4,d4
- add.w #128,d4
- move.b d4,d6
-
- ; neg.w y3
-
- .okpos
-
- ; add.w y2,d3
- ;
- ; move.w d3,d6
- ;
- ; asr.w #4,d6
- ;
- ; add.w #30,d6
- ;
- ; ble.s .okokok
- ;
- ; moveq #0,d6
- ;
- ;.okokok:
- ; add.w #$1c,d6
- ;
- ; cmp.w #1,d6
- ; bge.s .okokokok
- ; moveq #1,d6
- ;.okokokok:
-
- ;
- ; cmp.w #28,d6
- ; blt.s .okbig
- ; move.w #28,d6
- ;.okbig
-
- .dontbother:
- move.w d6,(a2)+
- move.w y3,(a2)+
-
- dbra d7,CALCSPECBRIGHTS
-
-
-
-
- * NOW THE POINTS FOR ON-SCREENNESS
-
- move.l #ROTATEDPTS,a2
- move.l PtsPtr,a0
- move.w num_points,d7
- subq #1,d7
-
- ROTPTLOP:
-
- move.w (a0)+,d0
- move.w d0,d3
- move.w (a0)+,d1
- move.w (a0)+,d2
- move.w d2,d5
-
-
-
- muls YCOS,d0
- muls YSIN,d2
- sub.l d2,d0
- asr.l #6,d0 ; new x*512
-
- muls YSIN,d3
- muls YCOS,d5
- add.l d5,d3
- add.l d3,d3
- swap d3
- move.w d3,d2 ; new z
-
- move.w d1,d4
- move.w d2,d5
- muls XCOS,d1
- muls XSIN,d2
- sub.l d2,d1
- asr.l #6,d1 ; new y*512
-
- muls XSIN,d4
- muls XCOS,d5
- add.l d5,d4
- add.l d4,d4
- swap d4
- move.w d4,d2 ; new z
-
- ext.l d2
-
- move.w XOFF,d5
- ext.l d5
- asl.l #8,d5
- add.l d5,d5
- add.l d5,d0
-
- move.l d0,(a2)+
- move.l d1,(a2)+
- move.w d2,(a2)+
-
- dbra d7,ROTPTLOP
-
- ; Now convert the rotated points to the screen:
-
- move.l #ROTATEDPTS,a0
- move.l #ONSCREENPTS,a2
- move.w num_points,d7
- subq #1,d7
- CONVERTTOSCREEN:
- move.l (a0)+,d0
- move.l (a0)+,d1
- move.w (a0)+,d2
- ; asr.w #1,d2
-
- add.w ZOFF,d2
- ext.l d2
-
- move.l d0,d3
- asr.l #1,d3
- add.l d3,d0
- move.l d1,d3
- asr.l #1,d3
- add.l d3,d1
-
- divs d2,d0
- divs d2,d1
- add.w #160*4,d0
- add.w #128*4,d1
- move.w d0,(a2)+
- move.w d1,(a2)+
- dbra d7,CONVERTTOSCREEN
-
- move.w #254,HIGHPOLY
-
- move.l LinesPtr,a1
- move.l #PartBuffer,a0
- move.l a0,a2
- move.w #15,d0
- clrpartbuffSHAD:
- move.l #$80000001,(a2)+
- move.l #$80000001,(a2)+
- move.l #$80000001,(a2)+
- move.l #$80000001,(a2)+
- dbra d0,clrpartbuffSHAD
-
- move.l #SHADOWPTS,a2
- move.l OBJONOFF,d5
-
- move.w #0,d4
- tst.w SORTIT
- bne.s PutInPartsSHAD
-
-
- putinunsortedSHAD:
- move.w (a1)+,d7
- blt doneallpartsSHAD
- lsr.l #1,d5
- bcs.s .yeson
- addq #2,a1
- bra putinunsortedSHAD
- .yeson:
-
- move.w (a1)+,d6
- move.l #0,(a0)+
- move.w d7,(a0)+
- move.w d4,(a0)+
- addq #1,d4
- bra putinunsortedSHAD
-
- PutInPartsSHAD
- move.w (a1)+,d7
- blt doneallpartsSHAD
-
- lsr.l #1,d5
- bcs.s .yeson
- addq #2,a1
- bra PutInPartsSHAD
- .yeson:
-
- move.w (a1)+,d6
- move.l 4(a2,d6.w),d0
- add.l #200000,d0
-
- move.l #PartBuffer-8,a0
-
- stillfrontSHAD
- addq #8,a0
- cmp.l (a0),d0
- blt stillfrontSHAD
- move.l #endparttab-8,a5
- domoreshiftSHAD:
- move.l -8(a5),(a5)
- move.l -4(a5),4(a5)
- subq #8,a5
- cmp.l a0,a5
- bgt.s domoreshiftSHAD
-
- move.l d0,(a0)
- move.w d7,4(a0)
- move.w d4,6(a0)
- addq #1,d4
- bra PutInPartsSHAD
-
- doneallpartsSHAD:
-
- move.l #PartBuffer,a0
-
- ifne SHADOWMAP
-
- PartLoopSHAD
- move.l (a0)+,d7
- blt nomorepartsSHAD
-
- move.l #SAVEHIGHS,a2
- move.w 2(a0),d0
- move.w HIGHPOLY,(a2,d0.w*2)
-
- moveq #0,d0
- move.w (a0),d0
- addq #4,a0
- add.l START_OF_OBJECT,d0
- move.l d0,a1
-
- polylooSHAD:
-
- tst.w (a1)
- blt.s nomorepolysSHAD
- movem.l a0/a1/d7,-(a7)
- bsr doaSHADEpoly
- movem.l (a7)+,a0/a1/d7
-
- move.w (a1),d0
- lea 18(a1,d0.w*4),a1
-
- bra.s polylooSHAD
- nomorepolysSHAD:
- sub.w #1,HIGHPOLY
- bra PartLoopSHAD
- nomorepartsSHAD:
-
- endc
-
- *******************************************
- * Now the on-screen bit...
- *******************************************
-
- move.l LinesPtr,a1
- move.l #PartBuffer,a0
- move.l a0,a2
- move.w #15,d0
- clrpartbuff:
- move.l #$80000001,(a2)+
- move.l #$80000001,(a2)+
- move.l #$80000001,(a2)+
- move.l #$80000001,(a2)+
- dbra d0,clrpartbuff
-
- move.l #ROTATEDPTS,a2
- move.l OBJONOFF,d5
-
- moveq #0,d4
-
- tst.w SORTIT
- bne.s PutInParts
-
- putinunsorted:
- move.w (a1)+,d7
- blt doneallparts
- lsr.l #1,d5
- bcs.s .yeson
- addq #2,a1
- bra putinunsorted
- .yeson:
-
- move.w (a1)+,d6
- move.l #0,(a0)+
- move.w d7,(a0)+
- move.w d4,(a0)+
-
- addq #1,d4
- bra putinunsorted
-
- PutInParts
- move.w (a1)+,d7
- blt doneallparts
-
- lsr.l #1,d5
- bcs.s .yeson
- addq #2,a1
- bra PutInParts
- .yeson:
-
- move.w (a1)+,d6
- move.l (a2,d6.w),d0
- asr.l #8,d0
- asr.l #2,d0
- muls d0,d0
- move.l 4(a2,d6.w),d2
- asr.l #8,d2
- asr.l #2,d2
- muls d2,d2
- add.l d2,d0
- move.w 8(a2,d6.w),d2
- add.w #1024,d2
- muls d2,d2
- add.l d2,d0
-
- move.l #PartBuffer-8,a0
-
- stillfront
- addq #8,a0
- cmp.l (a0),d0
- blt stillfront
- move.l #endparttab-8,a5
- domoreshift:
- move.l -8(a5),(a5)
- move.l -4(a5),4(a5)
- subq #8,a5
- cmp.l a0,a5
- bgt.s domoreshift
-
- move.l d0,(a0)
- move.w d7,4(a0)
- move.w d4,6(a0)
- addq #1,d4
- bra PutInParts
-
- doneallparts:
-
- move.l #PartBuffer,a0
-
- PartLoop
- move.l (a0)+,d7
- blt nomoreparts
-
- move.l #SAVEHIGHS,a2
- move.w 2(a0),d0
- move.w (a2,d0.w*2),HIGHPOLY
-
- moveq #0,d0
- move.w (a0),d0
- addq #4,a0
- add.l START_OF_OBJECT,d0
- move.l d0,a1
-
- polyloo:
-
- tst.w (a1)
- blt.s nomorepolys
- movem.l a0/a1/d7,-(a7)
- bsr doapoly
- movem.l (a7)+,a0/a1/d7
-
- move.w (a1),d0
- lea 18(a1,d0.w*4),a1
-
- bra.s polyloo
- nomorepolys:
- sub.w #1,HIGHPOLY
- bra PartLoop
- nomoreparts:
-
- NOPOLYS:
-
- ; btst #6,$bfe001
- ; beq.s .SHOWSHADOW
-
- ifne MOTIONBLUR
-
- move.l FASTBUFFER,d0
- cmp.l #fasty,d0
- bne .SHOWNSCRN
-
- move.l #fasty,a0
- move.l #fasty2,a1
- add.l #40*320+64,a0
- add.l #40*320+64,a1
- move.l #BLUR,a2
- move.w #175,d0
- moveq #0,d6
- .blurchunk:
- move.w #(192/4)-1,d1
- .blurline:
-
- move.l (a0),d2
- move.l d2,d4
- swap d4
- move.l (a1)+,d3
- move.l d3,d5
- swap d5
-
- lsr.w #8,d5
- move.b d5,d4
- move.w d4,d6
- move.b (a2,d6.l),d7
-
- lsl.l #8,d7
- lsl.l #8,d2
- lsl.l #8,d3
- move.l d2,d4
- move.l d3,d5
- swap d4
- swap d5
- lsr.w #8,d5
- move.b d5,d4
- move.w d4,d6
- move.b (a2,d6.l),d7
-
- lsl.l #8,d7
- lsl.l #8,d2
- lsl.l #8,d3
- move.l d2,d4
- move.l d3,d5
- swap d4
- swap d5
- lsr.l #8,d5
- move.b d5,d4
- move.w d4,d6
- move.b (a2,d6.l),d7
-
- lsl.l #8,d7
- lsl.l #8,d2
- lsl.l #8,d3
- move.l d2,d4
- move.l d3,d5
- swap d4
- swap d5
- lsr.l #8,d5
- move.b d5,d4
- move.w d4,d6
- move.b (a2,d6.l),d7
-
- move.l d7,(a0)+
-
- dbra d1,.blurline
-
- add.w #(320-192),a1
- add.w #(320-192),a0
- dbra d0,.blurchunk
-
- endc
-
- ifeq LARGESCREEN
-
- move.l FASTBUFFER,a0
- add.l #40*320+64,a0
- move.l #RAWSCRN,a1
- add.l #40*40+8,a1
- move.l #(24)-1,d0
- move.l #175,d1
- move.w #128,d2
- move.w #16,d3
- moveq #0,d4
- moveq #0,d5
- jsr CHUNKYTOPLANAR
-
- endc
-
- ifne LARGESCREEN
-
- move.l FASTBUFFER,a0
- move.l #RAWSCRN,a1
- move.l #39,d0
- move.l #255,d1
- move.w #0,d2
- move.w #0,d3
- moveq #0,d4
- moveq #0,d5
- jsr CHUNKYTOPLANAR
-
- endc
-
-
- bra .SHOWNSCRN
-
- .SHOWSHADOW
-
- move.l #SHADOWBUFFER,a0
- add.l #40*256,a0
- move.l #RAWSCRN,a1
- add.l #40*40,a1
- move.l #(256/8)-1,d0
- move.l #175,d1
- move.w #0,d2
- move.w #8,d3
- moveq #0,d4
- moveq #0,d5
- jsr CHUNKYTOPLANAR
-
- .SHOWNSCRN:
-
- ifne MOTIONBLUR
-
- move.l #fasty2,d1
- move.l FASTBUFFER,d0
- cmp.l #fasty,d0
- beq.s .ok2
- move.l #fasty,d1
- .ok2:
- move.l d1,FASTBUFFER
-
- endc
-
- move.l FASTBUFFER,a0
- move.l #NEBBIE,a1
- ifeq LARGESCREEN
- add.l #40*320+64,a0
- endc
-
- move.l #BLUR,a2
- ifeq LARGESCREEN
- moveq #0,d6
- move.w #175,d0
- endc
- ifne LARGESCREEN
- move.l #$e5e5e5e5,d6
- move.w #511,d0
- endc
-
- clrchunk:
-
- ifeq LARGESCREEN
- REPT 192/4
- move.l (a1)+,(a0)+
- endr
- add.w #(320-192),a0
- endc
-
- ifne LARGESCREEN
- REPT 160/4
- move.l d6,(a0)+
- endr
- endc
-
- dbra d0,clrchunk
-
- move.l #SHADOWBUFFER,a0
- move.l #-1,d1
- move.l #-1,d2
- move.w #15,d0
- ;clrshad:
- ; move.w #15,d5
- ;innner
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d2,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; move.l d1,(a0)+
- ; dbra d5,innner
- ; exg d1,d2
- ;
- ; dbra d0,clrshad
-
-
-
- btst #7,$bfe001
- beq.s exit_closescr
-
-
- add.l #$8000,lmxoff
- cmp.l #40*65536,lmxoff
- blt.s .oksm
- sub.l #40*65536,lmxoff
- .oksm
-
- bra loop
-
- lmxoff: dc.l 0
-
- exit_closescr
- move.l MyScreen(pc),a0
- CALLINT CloseScreen
-
- exit_closeall
- move.l _GfxBase(pc),a1
- CALLEXEC CloseLibrary
-
- exit_closeint
- move.l _IntuitionBase(pc),a1
- CALLEXEC CloseLibrary
-
- exit_false
- move.l #0,d0 return code
- rts
-
- TESTTAB: ds.w 30
-
- ************************************************
- * SUBROUTINES HERE. ****************************
- ************************************************
-
-
- **********************************************************
-
- * the definition of the screen - note that in assembler you
- * MUST get the sizes of these fields correct, by consulting either
- * the RKM or the header files
-
-
- MyNewScreen dc.w 0,0 left, top
- dc.w 320,256 width, height
- dc.w 8 depth
- dc.b 0,1 pens
- dc.w 0 viewmodes
- dc.w CUSTOMSCREEN type
- dc.l MyFont font
- dc.l screen_title title
- dc.l 0 gadgets
- dc.l 0 bitmap
-
- * my font definition
- MyFont dc.l font_name
- dc.w TOPAZ_SIXTY
- dc.b FS_NORMAL
- dc.b FPF_ROMFONT
-
- * the variables
- _IntuitionBase dc.l 0 Intuition lib pointer
- _GfxBase dc.l 0 graphics lib pointer
- MyScreen dc.l 0
- MyWindow dc.l 0
- MyNewWindow ds.b nw_SIZE a buffer
-
-
- * some strings
- int_name INTNAME
- graf_name GRAFNAME
- hello_message dc.b 'Hello World'
-
- * these are C strings, so have to be null terminated
- screen_title dc.b 'My Own Screen',0
- font_name dc.b 'topaz.font',0
- window_title dc.b 'A Simple Window',0
-
- even
-
-
- doaSHADEpoly:
-
- move.w (a1)+,d7 ; sides to draw
- addq #2,a1 ; avoid holes
-
- move.l #SHADOWPTS,a3
-
- move.w (a1),d0
- move.w 4(a1),d1
- move.w 8(a1),d2
- muls #10,d0
- muls #10,d1
- muls #10,d2
- move.w 8(a3,d0.w),d3
- move.w 8(a3,d1.w),d4
- move.w 8(a3,d2.w),d5
- move.l (a3,d0.w),d0
- move.l (a3,d1.w),d1
- move.l (a3,d2.w),d2
- asr.l #8,d0
- asr.l #8,d1
- asr.l #8,d2
- asr.l #1,d0
- asr.l #1,d1
- asr.l #1,d2
-
- sub.w d1,d0
- sub.w d1,d2
- sub.w d4,d3
- sub.w d4,d5
- muls d3,d2
- muls d5,d0
- sub.l d0,d2
- bge SHADpolybehind
-
-
-
- move.w #20000,d4 ; top
- move.w #-20000,d5 ; bottom
- move.l #UVCOORDS,a4
-
- putinlinesSHAD:
- move.w (a1),d0
- move.w 4(a1),d1
-
- moveq #0,d2
- move.b 2(a1),d2 ; one end U
- move.w d2,2(a4,d0.w*4)
- move.b 3(a1),d2 ; one end V
- move.w d2,(a4,d0.w*4)
- move.b 6(a1),d2 ; two end U
- move.w d2,2(a4,d1.w*4)
- move.b 7(a1),d2 ; two end V
- move.w d2,(a4,d1.w*4)
-
- move.w d0,d2
- muls #10,d2
- move.w 8(a3,d2.w),d2 ; Z
-
- cmp.w d2,d4
- ble.s .oktop
- move.w d2,d4
- .oktop
- cmp.w d2,d5
- bge.s .okbot
- move.w d2,d5
- .okbot
-
- movem.l d4/d5/d7/a1/a3/a4,-(a7)
- bsr SIMPLESHADLINE
- movem.l (a7)+,d4/d5/d7/a1/a3/a4
- addq #4,a1
- dbra d7,putinlinesSHAD
- addq #4,a1
-
- move.w (a1)+,TEXTUREADD
-
- asr.w #2,d4
- asr.w #2,d5
- add.w #128,d4
- add.w #128,d5
- move.w d4,TOPLINE
- move.w d5,BOTLINE
-
- * Now draw the shadow polygon....
-
- move.l #SHADOWBUFFER,a2
- move.l #LEFTUVS,a0
- move.w TOPLINE,d0
- move.w BOTLINE,d1
- sub.w d0,d1
- asl.w #3,d0
- add.w d0,a0
- muls #(512/8),d0
- add.l d0,a2 ; pointer to screen line.
-
- subq #1,d1
- blt NOPOLYGONSHAD
-
- DOAHORLINESHAD:
- swap d1
-
- move.w RIGHTUVS-LEFTUVS(a0),d0
- move.w (a0)+,d7
- sub.w d7,d0
- blt NOPOLYGONSHAD
-
- move.l a2,-(a7)
-
- ; asr.w #2,d0
- ; asr.w #2,d7
- lea (a2,d7.w*2),a2
- ext.l d0
- addq #1,d0
-
- move.w RIGHTUVS-LEFTUVS(a0),d7
- move.w (a0)+,d4
- swap d7
- clr.w d7
- swap d4
- clr.w d4
- sub.l d4,d7
- divs.l d0,d7
- move.l d7,a5
-
- move.w RIGHTUVS-LEFTUVS(a0),d7
- swap d7
- clr.w d7
- move.w (a0)+,d5
- swap d5
- clr.w d5
- sub.l d5,d7
- divs.l d0,d7
- move.l d7,a6
-
- move.w RIGHTUVS-LEFTUVS(a0),d7
- swap d7
- clr.w d7
- move.w (a0)+,d6
- swap d6
- clr.w d6
- sub.l d6,d7
- divs.l d0,d7
- move.l d7,a3
-
- move.l a0,-(a7)
- move.l d1,-(a7)
- move.l #TEXTURES,a0
- move.w TEXTUREADD,d7
- bge.s .okaddtes3
- and.w #$7fff,d7
- add.l #65536*4,a0
- .okaddtes3:
- ext.l d7
- ; add.l d7,d7
- asl.l #8,d7
- add.l d7,a0
- move.w #0,d7
-
- subq #1,d0
-
- ; d0=xdist
- ; d4=U a5=DU
- ; d5=V a6=DV
- ; d6=Y a3=DY
- moveq #0,d1
-
- swap d6
-
- PLOTADOT:
-
- .across
-
- ; swap d4
- ; swap d5
- ; move.w d4,d2
- ; lsl.w #8,d2
- ; swap d4
- ; move.b d5,d2
- ; add.l a5,d4
- ; swap d5
- ; add.l a6,d5
-
-
- ; swap d6
- ; move.b (a2)+,d1
- ; tst.b 1(a0,d2.w*8)
- ; beq.s .noplottt
- move.b d6,(a2)
- addq #2,a2
-
- dbra d0,.across
- bra.s .plaster
-
- .noplottt:
- addq #1,a2
- dbra d0,.across
-
- .plaster:
-
- move.l (a7)+,d1
- move.l (a7)+,a0
- move.l (a7)+,a2
-
- .noline:
- add.w #512,a2
-
- swap d1
- dbra d1,DOAHORLINESHAD
-
- NOPOLYGONSHAD:
-
- SHADpolybehind:
- rts
-
-
- ************************************************
-
- LU: dc.w 0
- LV: dc.w 0
- RU: dc.w 0
- RV: dc.w 0
-
- SIMPLESHADLINE:
- move.l #SHADOWPTS,a1
-
- move.l #UVCOORDS,a2
- move.w (a2,d0.w*4),LU
- move.w 2(a2,d0.w*4),LV
- move.w (a2,d1.w*4),RU
- move.w 2(a2,d1.w*4),RV
-
- muls #10,d0
- muls #10,d1
- move.w 8(a1,d0.w),d2 ;fz
- move.w 8(a1,d1.w),d7 ;sz
- ext.l d2
- ext.l d7
-
- move.l #LEFTUVS,a3
- asr.l #2,d2
- asr.l #2,d7
- cmp.l d2,d7
- beq .noline
-
- bgt.s .lineonright
- .lineonleft:
- move.l #RIGHTUVS,a3
- exg d0,d1
- exg d2,d7
-
- move.l LU,d5
- move.l RU,LU
- move.l d5,RU
-
- .lineonright:
-
- sub.w d2,d7
- add.w #128,d2
- lea (a3,d2.w*8),a3
-
- move.w d7,YDIFF
-
- move.l (a1,d0.w),d3 ;fx
- move.l (a1,d1.w),d7 ;sx
-
- asl.l #5,d3
- asl.l #5,d7
-
- sub.l d3,d7
- divs.l YDIFF-2,d7
- move.l d7,a0 ; dx
-
- move.l #ROTATEDPTS,a1
-
- move.w LU,d4
- move.w LV,d5
- move.w RU,d6
- move.w RV,d7
-
- sub.w d4,d6
- sub.w d5,d7
- swap d4
- swap d5
- clr.w d4
- clr.w d5
- swap d6
- swap d7
- clr.w d6
- clr.w d7
-
- divs.l YDIFF-2,d6
- divs.l YDIFF-2,d7
-
- move.l d6,a4
- move.l d7,a5
-
- ; asl.w #4,d0
- ; asl.w #4,d1
-
- move.l 4(a1,d0.w),d6
- move.l 4(a1,d1.w),d7
- asl.l #5,d6
- asl.l #5,d7
- sub.l d6,d7
- divs.l YDIFF-2,d7
- exg d7,a6
- exg d7,d6
-
- move.l YDIFF-2,d1
- subq #1,d1
-
- ; d3=x a0=dx
- ; d4=u a4=du
- ; d5=v a5=dv
- ; d7=y a6=dy
- ; d1=dz
-
- move.w HIGHPOLY,d7
-
- add.l #128*65536,d3
- ; add.l #128*65536,d7
-
- .PUTINLINE:
- swap d3
- move.w d3,(a3)+
- swap d3
- add.l a0,d3
- swap d4
- move.w d4,(a3)+
- swap d4
- swap d5
- add.l a4,d4
- move.w d5,(a3)+
- swap d5
- add.l a5,d5
- ; swap d7
- move.w d7,(a3)+
- ; swap d7
- ; add.l a6,d7
- dbra d1,.PUTINLINE
-
- .noline:
- rts
-
- BCOS: dc.w 0
- BSIN: dc.w 0
- ACOS: dc.w 0
- ASIN: dc.w 0
-
- CCOS: dc.w 0
- CSIN: dc.w 0
- DCOS: dc.w 0
- DSIN: dc.w 0
- ECOS: dc.w 0
- ESIN: dc.w 0
-
- FSX: dc.w 0
- FSY: dc.w 0
- SSX: dc.w 0
- SSY: dc.w 0
-
- **************************************************
-
- doapoly:
-
- move.w (a1)+,d7 ; sides to draw
- addq #2,a1 ; avoid holes
- move.w 12(a1,d7.w*4),pregour
-
- move.l #ONSCREENPTS,a3
-
- move.w (a1),d0
- move.w 4(a1),d1
- move.w 8(a1),d2
- move.w 2(a3,d0.w*4),d3
- move.w 2(a3,d1.w*4),d4
- move.w 2(a3,d2.w*4),d5
- move.w (a3,d0.w*4),d0
- move.w (a3,d1.w*4),d1
- move.w (a3,d2.w*4),d2
-
- sub.w d1,d0
- sub.w d1,d2
- sub.w d4,d3
- sub.w d4,d5
- muls d3,d2
- muls d5,d0
- sub.l d0,d2
- ble polybehind
-
- ; Now we must rotate the polygons coordinates in
- ; the specular map so that the texturemap is vertical
- ; relative to the specular map and so that bump-
- ; mapping can take place unerroneously!
-
- ; movem.l d0-d7/a0-a6,-(a7)
-
- move.w #0,BCOS
- move.w #128*128,ACOS
- move.w #0,BSIN
- move.w #0,ASIN
-
- moveq #0,d3
- move.b 2(a1),d3
- moveq #0,d4
- move.b 3(a1),d4
- moveq #0,d5
- move.b 2+4(a1),d5
- moveq #0,d6
- move.b 3+4(a1),d6
-
- sub.w d3,d5
- sub.w d4,d6
-
- move.w d5,d1
- move.w d6,d2
- muls d1,d1
- muls d2,d2
- add.l d1,d2
- jsr CALCSQROOT
- tst.w d2
- beq .NOROT
-
- ext.l d5
- ext.l d6
- asl.l #7,d5
- asl.l #7,d6
- divs d2,d5
- divs d2,d6
- move.w d5,ECOS
- move.w d6,ESIN
-
- move.w ECOS,d0
- asl.w #7,d0
- move.w d0,ACOS
- move.w ESIN,d0
- asl.w #7,d0
- move.w d0,ASIN
-
- move.l #SPECBRIGHTS,a3
-
- move.w (a1),d0
- moveq #0,d5
- moveq #0,d6
- move.b (a3,d0.w*4),d5
- move.b 1(a3,d0.w*4),d6
- move.w 4(a1),d0
- moveq #0,d3
- moveq #0,d4
- move.b (a3,d0.w*4),d3
- move.b 1(a3,d0.w*4),d4
- sub.w d5,d3
- sub.w d6,d4
-
- move.w d3,d1
- move.w d4,d2
- muls d1,d1
- muls d2,d2
- add.l d1,d2
- jsr CALCSQROOT
- tst.w d2
- beq .NOROT1
-
- ext.l d3
- asl.l #7,d3
- ext.l d4
- asl.l #7,d4
- divs d2,d3
- divs d2,d4
- move.w d3,BCOS
- neg.w d4
- move.w d4,BSIN
-
- move.w ECOS,d4
- move.w ESIN,d5
- move.w d4,d2
- move.w d5,d3
- muls BCOS,d2
- muls BSIN,d3
- sub.l d3,d2
- muls BSIN,d4
- muls BCOS,d5
- add.l d5,d4
- move.w d2,ACOS
- move.w d4,ASIN
-
- .NOROT1
-
- move.w #0,DCOS
- move.w #0,DSIN
- move.w ECOS,d0
- asl.w #7,d0
- move.w d0,CCOS
- move.w ESIN,d0
- asl.w #7,d0
- move.w d0,CSIN
-
- ; bra .NOROT
-
- ; First calculate angle B
-
- move.l #NORMBRIGHTS,a3
-
- movem.l d7/a1,-(a7)
-
- .findnonzer:
-
- move.w (a1),d0
- moveq #0,d5
- moveq #0,d6
- move.b (a3,d0.w*2),d5
- move.b 1(a3,d0.w*2),d6
- move.w 4(a1),d0
- moveq #0,d3
- moveq #0,d4
- move.b (a3,d0.w*2),d3
- move.b 1(a3,d0.w*2),d4
- sub.w d5,d3
- sub.w d6,d4
- bne.s .okok
- tst.w d3
- bne.s .okok
-
- addq #4,a1
-
- dbra d7,.findnonzer
-
- movem.l (a7)+,d7/a1
- bra .NOROT
-
- .okok:
-
- moveq #0,d3
- move.b 2(a1),d3
- moveq #0,d4
- move.b 3(a1),d4
- moveq #0,d5
- move.b 2+4(a1),d5
- moveq #0,d6
- move.b 3+4(a1),d6
-
- sub.w d3,d5
- sub.w d4,d6
-
- move.w d5,d1
- move.w d6,d2
- muls d1,d1
- muls d2,d2
- add.l d1,d2
- jsr CALCSQROOT
- tst.w d2
- beq .NOROT8
-
- ext.l d5
- ext.l d6
- asl.l #7,d5
- asl.l #7,d6
- divs d2,d5
- divs d2,d6
- move.w d5,ECOS
- neg.w d6
- move.w d6,ESIN
- move.w ECOS,d0
- asl.w #7,d0
- move.w d0,CCOS
- move.w ESIN,d0
- asl.w #7,d0
- neg.w d0
- move.w d0,CSIN
-
- .NOROT8:
-
- movem.l (a7)+,d7/a1
-
- move.w d3,d1
- move.w d4,d2
- muls d1,d1
- muls d2,d2
- add.l d1,d2
- jsr CALCSQROOT
- tst.w d2
- beq .NOROT
-
- ext.l d3
- asl.l #7,d3
- ext.l d4
- asl.l #7,d4
- divs d2,d3
- divs d2,d4
- move.w d3,DCOS
- neg.w d4
- move.w d4,DSIN
-
- move.w ECOS,d4
- move.w ESIN,d5
- move.w d4,d2
- move.w d5,d3
- muls DCOS,d2
- muls DSIN,d3
- sub.l d3,d2
- muls DSIN,d4
- muls DCOS,d5
- add.l d5,d4
- move.w d2,CCOS
- move.w d4,CSIN
-
-
- .NOROT:
-
- ; movem.l (a7)+,d0-d7/a0-a6
-
- move.l #ONSCREENPTS,a3
-
- move.w #20000,d4 ; top
- move.w #-20000,d5 ; bottom
- move.l #UVCOORDS,a4
-
- move.l a1,a0
-
- putinlines:
- move.w (a1),d0
- move.w 4(a1),d1
-
- moveq #0,d2
- move.b 2(a1),d2 ; one end U
- move.w d2,2(a4,d0.w*4)
- move.b 3(a1),d2 ; one end V
- move.w d2,(a4,d0.w*4)
- move.b 6(a1),d2 ; two end U
- move.w d2,2(a4,d1.w*4)
- move.b 7(a1),d2 ; two end V
- move.w d2,(a4,d1.w*4)
-
- move.w 2(a3,d0.w*4),d2 ; Z
-
- cmp.w d2,d4
- ble.s .oktop
- move.w d2,d4
- .oktop
- cmp.w d2,d5
- bge.s .okbot
- move.w d2,d5
- .okbot
-
- movem.l a0/d4/d5/d7/a1/a3/a4,-(a7)
- jsr SIMPLECALCLINE
- movem.l (a7)+,a0/d4/d5/d7/a1/a3/a4
- addq #4,a1
- dbra d7,putinlines
- addq #4,a1
-
- move.w (a1)+,TEXTUREADD
-
- asr.w #2,d4
- asr.w #2,d5
- ; add.w #128,d4
- ; add.w #128,d5
- move.w d4,TOPLINE
- move.w d5,BOTLINE
-
- move.l #SHADOWPTS,a1
- move.w (a0),d0
- move.w 4(a0),d1
- move.w 8(a0),d2
-
- CHECKVALS:
-
- muls #10,d0
- muls #10,d1
- muls #10,d2
-
- lea (a1,d0.w),a0
- lea (a1,d2.w),a2
- lea (a1,d1.w),a1
-
- move.l (a0),d3
- sub.l (a1),d3
- asr.l #8,d3
- asr.l #1,d3
- move.l 4(a0),d4
- sub.l 4(a1),d4
- asr.l #8,d4
- asr.l #1,d4
- move.w 8(a0),d5
- sub.w 8(a1),d5
-
- move.w d3,d6
- muls d6,d6
- move.w d4,d7
- muls d7,d7
- add.l d7,d6
- move.w d5,d7
- muls d7,d7
- add.l d7,d6
- move.l d6,d2
- jsr CALCSQROOT
- move.w d2,LEN1
-
- move.l (a2),d0
- sub.l (a1),d0
- asr.l #8,d0
- asr.l #1,d0
- move.l 4(a2),d1
- sub.l 4(a1),d1
- asr.l #8,d1
- asr.l #1,d1
- move.w 8(a2),d2
- sub.w 8(a1),d2
-
- muls d2,d3
- muls d0,d5
- sub.l d3,d5 ; length
- muls.l #$4c,d5
-
- muls d0,d0
- muls d1,d1
- muls d2,d2
- add.l d0,d1
- add.l d1,d2
- jsr CALCSQROOT
-
- muls LEN1,d2
- bgt.s .ok
- moveq #1,d2
- .ok
-
- divs.l d2,d5
-
- add.l #16,d5
-
- tst.l d5
- ble.s .okbr
- moveq #0,d5
- .okbr:
- add.w #$5c,d5
- bge.s .okbr2
- moveq #0,d5
- .okbr2:
-
- move.w d5,d0
-
- asl.w #8,d5
- move.w d5,BRIGHTNESS+2
-
- sub.w #$5c,d0
- asr.w #1,d0
- add.w #$5c,d0
- asl.w #8,d0
- move.w d0,BRIGHTNESS
-
-
- ***********************************************
- * Draw the polygon (shadowed).
-
- move.l FASTBUFFER,a2
- move.l #LEFTUVS,a0
- move.w TOPLINE,d0
- move.w BOTLINE,d1
- sub.w d0,d1
- move.w d0,d2
- muls #20,d2
- add.l d2,a0
- muls #320,d0
- add.l d0,a2 ; pointer to screen line.
-
- subq #1,d1
- blt NOPOLYGON
-
- tst.b Gouraud
- bne GOURPOLY
-
- DOAHORLINE:
- swap d1
-
- move.w RIGHTUVS-LEFTUVS(a0),d0
- move.w (a0)+,d7
- asr.w #2,d0
- asr.w #2,d7
- sub.w d7,d0
- bge.s .okflibble
-
- add.w #14,a0
- add.w #320,a2
- swap d1
- dbra d1,DOAHORLINE
- bra NOPOLYGON
-
- .okflibble:
-
- move.l a2,-(a7)
-
- add.w d7,a2
- ext.l d0
- addq #1,d0
-
- move.l RIGHTUVS-LEFTUVS(a0),d7
- move.l (a0)+,d2
- sub.l d2,d7
- divs.l d0,d7
- move.l d7,a1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- move.l RIGHTUVS-LEFTUVS(a0),d7
- move.l (a0)+,d3
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- sub.l d3,d7
- divs.l d0,d7
- move.l d7,a4
-
- move.w RIGHTUVS-LEFTUVS(a0),d7
- move.w (a0)+,d4
- swap d7
- clr.w d7
- swap d4
- clr.w d4
- sub.l d4,d7
- divs.l d0,d7
- move.l d7,a5
-
- move.w RIGHTUVS-LEFTUVS(a0),d7
- swap d7
- clr.w d7
- move.w (a0)+,d5
- swap d5
- clr.w d5
- sub.l d5,d7
- divs.l d0,d7
- move.l d7,a6
-
- move.w RIGHTUVS-LEFTUVS(a0),d7
- swap d7
- clr.w d7
- move.w (a0)+,d6
- swap d6
- clr.w d6
- sub.l d6,d7
- divs.l d0,d7
- move.l d7,a3
-
- move.l a0,-(a7)
- move.l d1,-(a7)
- move.l #TEXTURES,a0
- move.w TEXTUREADD,d7
- bge.s .okaddtes3
- and.w #$7fff,d7
- add.l #65536*4,a0
- .okaddtes3:
- ext.l d7
- ; add.l d7,d7
- asl.l #8,d7
- add.l d7,a0
- move.w #0,d7
-
- move.l BRIGHTNESS,a6
-
- move.l a7,SAVESTACK
- move.l #SHADOWBUFFER,a7
-
- subq #1,d0
-
- ; d0=xdist
- ; d2=U a1=DU
- ; d3=V a4=DV
- ; d4=X a5=DX
- ; d5=Y a6=DY
- ; d6=Z a3=DZ
- move.w HIGHPOLY,d5
-
- moveq #0,d1
- swap d6
- move.w d6,d1
- lsl.w #8,d1
- swap d4
- move.b d4,d1
- swap d4
- swap d6
-
- moveq #0,d7
- move.b (a7,d1.l),d7
- cmp.w d7,d5
- ble INTHELIGHT
- bra.s INTHEDARK
-
- PENUMBRA:
- moveq #0,d1
- swap d6
- move.w d6,d1
- lsl.w #8,d1
- swap d4
- move.b d4,d1
- swap d4
- swap d6
- add.l a5,d4
- add.l a3,d6
-
- moveq #0,d7
- move.b (a7,d1.l),d7
- cmp.w d7,d5
- ble INTOLIGHT
- bra.s INTODARK
-
-
- INTHEDARK:
- moveq #0,d1
- swap d6
- move.w d6,d1
- lsl.w #8,d1
- swap d4
- move.b d4,d1
- swap d4
- swap d6
- add.l a5,d4
- add.l a3,d6
-
- moveq #0,d7
- move.b (a7,d1.l),d7
- cmp.w d7,d5
- ble.s INTOPENUM
- INTODARK:
- move.w #$5c00,d7
- swap d2
- move.w d2,d1
- asl.w #8,d1
- swap d3
- move.b d3,d1
- swap d2
- swap d3
- add.l a1,d2
- add.l a4,d3
-
- ; move.b (a0,d1.w*4),d7
- ; beq.s .noplottt
-
- move.b TEXTUREPAL-256(pc,d7.w),(a2)+
- dbra d0,INTHEDARK
- bra.s PASTAC
-
- .noplottt
- addq #1,a2
- dbra d0,INTHEDARK
- bra.s PASTAC
-
- INTOPENUM:
- move.l a6,d7
- swap d7
- swap d2
- move.w d2,d1
- asl.w #8,d1
- swap d3
- move.b d3,d1
- swap d2
- swap d3
- add.l a1,d2
- add.l a4,d3
-
- ; move.b (a0,d1.w*4),d7
- ; beq.s .noplottt
-
- move.b TEXTUREPAL(pc,d7.w),(a2)+
- dbra d0,PENUMBRA
- bra.s PASTAC
-
- .noplottt
- addq #1,a2
- dbra d0,PENUMBRA
- bra.s PASTAC
-
- INTHELIGHT:
-
- moveq #0,d1
- swap d6
- move.w d6,d1
- lsl.w #8,d1
- swap d4
- move.b d4,d1
- swap d4
- swap d6
- add.l a5,d4
- add.l a3,d6
-
- moveq #0,d7
- move.b (a7,d1.l),d7
- cmp.w d7,d5
- bgt.s INTOPENUM
- INTOLIGHT:
- move.w a6,d7
- swap d2
- move.w d2,d1
- asl.w #8,d1
- swap d3
- move.b d3,d1
- swap d2
- swap d3
- add.l a1,d2
- add.l a4,d3
-
- ; move.b (a0,d1.w*4),d7
- ; beq.s .noplottt
-
- move.b TEXTUREPAL(pc,d7.w),(a2)+
- dbra d0,INTHELIGHT
- bra.s PASTAC
-
- .noplottt:
- addq #1,a2
- dbra d0,INTHELIGHT
-
- PASTAC
-
- move.l SAVESTACK,a7
-
- move.l (a7)+,d1
- move.l (a7)+,a0
- move.l (a7)+,a2
-
- .noline:
- add.w #320,a2
-
- swap d1
- dbra d1,DOAHORLINE
-
- NOPOLYGON:
- polybehind:
- rts
-
- TEXTUREPAL:
-
- SAVESTACK: dc.l 0
- HIGHPOLY: dc.w 0
- LEN1: dc.w 0
- BRIGHTNESS: dc.l 0
- TRANSTEXT: dc.w 0
- AANG: dc.w 0
- BANG: dc.w 0
- CANG: dc.w 0
- DANG: dc.w 0
-
- include "ab3:print.s"
-
- temp: dc.w 0
-
- GOURPOLY:
-
- DOAHORLINEGOUR:
- swap d1
-
- ifeq SHADING
- move.w #128,16(a0)
- move.w #128,16+RIGHTUVS-LEFTUVS(a0)
- move.w #128,4+RIGHTUVS-LEFTUVS(a0)
- move.w #128,4(a0)
- endc
-
- move.w RIGHTUVS-LEFTUVS(a0),d0
- move.w (a0)+,d7
- asr.w #2,d0
- asr.w #2,d7
- sub.w d7,d0
- bge.s .okflibble
-
- add.w #18,a0
- add.w #320,a2
- swap d1
- dbra d1,DOAHORLINEGOUR
- bra NOPOLYGON
-
- .okflibble:
-
- move.l a2,-(a7)
-
- add.w d7,a2
- ext.l d0
- addq #1,d0
-
- move.b RIGHTUVS-LEFTUVS(a0),d3
- move.b (a0),d2
-
- ext.w d3
- ext.w d2
-
- tst.w d2
- blt .bothtowards
-
- ; bgt .firstaway
- tst.w d3
- blt .bothtowards
- bra .bothaway
-
- .firsttowards:
- tst.w d3
- ble .bothtowards
-
- ; First is towards and second away...
-
- move.w d0,d7 ; total length
- move.w d0,d6
- neg.w d2
- add.w d2,d3
- muls d2,d6
- divs d3,d6 ; length of first bit
- sub.w d6,d7 ; length of second bit
- move.w d6,FIRSTLEN
- move.w d7,LASTLEN
-
- tst.w FIRSTLEN
- beq .bothaway
- tst.w LASTLEN
- beq .bothtowards
-
- moveq #0,d2
- moveq #0,d3
- moveq #0,d4
- moveq #0,d5
- move.b 6(a0),d2
- move.b 7(a0),d3
-
- move.w d2,FIRSTU
- move.w d3,FIRSTV
-
- move.w d2,d4
- move.w d3,d5
- sub.w #128,d2
- sub.w #128,d3
- muls d2,d2
- muls d3,d3
- add.l d3,d2
- jsr CALCSQROOT
-
- tst.w d2
- beq.s .nochng
-
- sub.w #128,d4
- sub.w #128,d5
- muls #127,d4
- muls #127,d5
- divs d2,d4
- divs d2,d5
- add.w #128,d4
- add.w #128,d5
-
- .nochng:
-
- move.w d4,MIDU
- move.w d5,MIDV
-
- move.b 6+RIGHTUVS-LEFTUVS(a0),d4
- move.b 7+RIGHTUVS-LEFTUVS(a0),d5
- move.w d4,SECU
- move.w d5,SECV
-
- move.w d4,d2
- move.w d5,d3
-
- sub.w #128,d2
- sub.w #128,d3
- muls d2,d2
- muls d3,d3
- add.l d3,d2
- jsr CALCSQROOT
-
- tst.w d2
- beq.s .nochng2
-
- sub.w #128,d4
- sub.w #128,d5
- muls #127,d4
- muls #127,d5
- divs d2,d4
- divs d2,d5
- add.w #128,d4
- add.w #128,d5
-
- .nochng2:
-
- add.w MIDU,d4
- add.w MIDV,d5
- asr.w #1,d4
- asr.w #1,d5
- move.w d4,MIDU
- move.w d5,MIDV
-
- move.l RIGHTUVS-LEFTUVS(a0),d7
- move.l (a0)+,d2
-
- and.l #$ffffff,d2
- and.l #$ffffff,d7
-
- moveq #0,d3
- moveq #0,d5
- move.w d2,d3
- ; bge.s .okp1
- ; moveq #0,d3
- ;.okp1
- move.w d7,d5
- ; bge.s .okp2
- ; moveq #0,d5
- ;.okp2
-
- swap d3
- swap d5
- sub.l d3,d5
- divs.l d0,d5
- asr.l #8,d5
- move.w d5,RIGHTBRIGHT
- asr.l #8,d3
- move.w d3,LEFTBRIGHT
-
- clr.w d2
- clr.w d7
- sub.l d2,d7
- asl.l #8,d2
- divs.l d0,d7
- asl.l #8,d7
-
- move.l RIGHTUVS-LEFTUVS(a0),d6
- move.l (a0)+,d3
-
- moveq #0,d4
- moveq #0,d5
-
- ; move.w d6,d5
- ; move.w d3,d4
- ; move.b #0,d4
- ; move.b #0,d5
-
- move.w FIRSTU,d4
- move.w MIDU,d5
- lsl.l #8,d4
- lsl.l #8,d5
-
- sub.l d4,d5
- divs.l FIRSTLEN-2,d5
-
- move.w d4,d2
- move.w d5,d7
- move.l d7,a1
- moveq #0,d4
- moveq #0,d5
-
- ; move.b d6,d5
- ; move.b d3,d4
-
- ; swap d5
- ; swap d4
-
- move.w FIRSTV,d4
- move.w MIDV,d5
- swap d4
- swap d5
-
- sub.l d4,d5
- divs.l FIRSTLEN-2,d5
-
- move.l d5,a3
- move.l d4,d5
-
- clr.w d3
- clr.w d6
- sub.l d3,d6
- divs.l d0,d6
- move.l d6,a4
-
- move.w RIGHTUVS-LEFTUVS(a0),d7
- move.w (a0)+,d4
- swap d7
- clr.w d7
- swap d4
- clr.w d4
- sub.l d4,d7
- divs.l d0,d7
- move.l d7,a5
-
- ; move.w RIGHTUVS-LEFTUVS(a0),d7
- ; swap d7
- ; clr.w d7
- move.w (a0)+,d7
- ; swap d5
- ; clr.w d5
- ; sub.l d5,d7
- ; divs.l d0,d7
- ; move.l d7,a6
-
- move.w RIGHTUVS-LEFTUVS(a0),d7
- swap d7
- clr.w d7
- move.w (a0)+,d6
- swap d6
- clr.w d6
- sub.l d6,d7
- divs.l d0,d7
-
- lsl.l #8,d6
- lsl.l #8,d7
-
- move.w RIGHTBRIGHT,d7
- move.l d7,a6
-
-
- move.l a0,-(a7)
- move.l d1,-(a7)
- move.l #TEXTURES,a0
- move.w TEXTUREADD,d7
- bge.s .okaddtes3
- and.w #$7fff,d7
- add.l #65536*4,a0
- .okaddtes3:
- ext.l d7
- ; add.l d7,d7
- asl.l #8,d7
- add.l d7,a0
- move.w #0,d7
-
- move.w LEFTBRIGHT,d6
-
- subq #1,d0
- swap d0
- move.w HIGHPOLY,d0
- swap d0
-
-
- ; d0=xdist
- ; d2=U a1=DU
- ; d3=V a4=DV
- ; d4=X a5=DX
- ; d5=Y a6=DY
- ; d6=Z a3=DZ
-
- ; d0= polynum : polynum : counter : counter
- ; d1= scratch : scratch : scratch : scratch
- ; d2= u : uacc : sv : svacc
- ; d3= v : v : vacc : vacc
- ; d4= x : x : xacc : xacc
- ; d5= su : su : suacc : suacc
- ; d6= z : zacc : bright : brightacc
- ; d7= scratch : scratch : scratch : scratch
-
- ; a0= textures
- ; a1= uspeed : uspeed : suspeed : suspeed
- ; a2= screen pointer
- ; a3= svspeed : svspeed : svspeed : svspeed
- ; a4= vspeed : vspeed : vspeed : vspeed
- ; a5= xspeed : xspeed : xspeed : xspeed
- ; a6= zspeed : zspeed :brightspeed : brightspeed
- ; a7= shadowmap pointer
-
-
- move.w FIRSTLEN,d0
- sub.w #1,d0
- bsr STARTLINE
-
- move.l #0,d5
- move.w #0,d2
- move.l #0,a3
-
- move.w LASTLEN,d0
- sub.w #1,d0
-
- bsr STARTLINE
-
-
- move.l (a7)+,d1
- move.l (a7)+,a0
- move.l (a7)+,a2
-
- bra .noline
-
- .firstaway:
- tst.w d3
- bge .bothaway
-
-
- ; first is away and second is towards...
-
- ; this really isn't going to work...
-
- move.w d0,d7 ; total length
- move.w d0,d6
- neg.w d3
- add.w d2,d3
- muls d2,d6
- divs d3,d6 ; length of first bit
- sub.w d6,d7 ; length of second bit
- move.w d6,FIRSTLEN
- move.w d7,LASTLEN
-
- tst.w FIRSTLEN
- beq .bothaway
- tst.w LASTLEN
- beq .bothtowards
-
- moveq #0,d2
- moveq #0,d3
- moveq #0,d4
- moveq #0,d5
- move.b 6(a0),d2
- move.b 7(a0),d3
-
- move.w d2,FIRSTU
- move.w d3,FIRSTV
-
- move.w d2,d4
- move.w d3,d5
- sub.w #128,d2
- sub.w #128,d3
- muls d2,d2
- muls d3,d3
- add.l d3,d2
- jsr CALCSQROOT
-
- tst.w d2
- beq.s .nochng22
-
- sub.w #128,d4
- sub.w #128,d5
- muls #127,d4
- muls #127,d5
- divs d2,d4
- divs d2,d5
- add.w #128,d4
- add.w #128,d5
-
- .nochng22:
-
- move.w d4,MIDU
- move.w d5,MIDV
-
- moveq #0,d4
- moveq #0,d5
- move.b 6+RIGHTUVS-LEFTUVS(a0),d4
- move.b 7+RIGHTUVS-LEFTUVS(a0),d5
- move.w d4,SECU
- move.w d5,SECV
-
- move.w d4,d2
- move.w d5,d3
-
- sub.w #128,d2
- sub.w #128,d3
- muls d2,d2
- muls d3,d3
- add.l d3,d2
- jsr CALCSQROOT
-
- tst.w d2
- beq.s .nochng222
-
- sub.w #128,d4
- sub.w #128,d5
- muls #127,d4
- muls #127,d5
- divs d2,d4
- divs d2,d5
- add.w #128,d4
- add.w #128,d5
-
- .nochng222:
-
- add.w MIDU,d4
- add.w MIDV,d5
- asr.w #1,d4
- asr.w #1,d5
- move.w d4,MIDU
- move.w d5,MIDV
-
-
- move.l RIGHTUVS-LEFTUVS(a0),d7
- move.l (a0)+,d2
-
- and.l #$ffffff,d2
- and.l #$ffffff,d7
-
- moveq #0,d3
- moveq #0,d5
- move.w d2,d3
- move.w d7,d5
- swap d3
- swap d5
- sub.l d3,d5
- divs.l d0,d5
- asr.l #8,d5
- move.w d5,RIGHTBRIGHT
- asr.l #8,d3
- move.w d3,LEFTBRIGHT
-
- clr.w d2
- clr.w d7
- sub.l d2,d7
- asl.l #8,d2
- divs.l d0,d7
- asl.l #8,d7
-
- move.l RIGHTUVS-LEFTUVS(a0),d6
- move.l (a0)+,d3
-
- moveq #0,d4
- moveq #0,d5
-
- move.w MIDU,d4
- move.w SECU,d5
- lsl.w #8,d4
- lsl.w #8,d5
-
- ; move.w d6,d5
- ; move.w d3,d4
- ; move.b #0,d4
- ; move.b #0,d5
-
- sub.l d4,d5
- divs.l LASTLEN-2,d5
-
- move.w d4,d2
- move.w d5,d7
- move.l d7,a1
- moveq #0,d4
- moveq #0,d5
-
- move.w MIDV,d4
- move.w SECV,d5
-
- swap d5
- swap d4
-
- sub.l d4,d5
- divs.l LASTLEN-2,d5
-
- move.l d5,a3
- move.l d4,d5
-
- clr.w d3
- clr.w d6
- sub.l d3,d6
- divs.l d0,d6
- move.l d6,a4
-
- move.w RIGHTUVS-LEFTUVS(a0),d7
- move.w (a0)+,d4
- swap d7
- clr.w d7
- swap d4
- clr.w d4
- sub.l d4,d7
- divs.l d0,d7
- move.l d7,a5
-
- ; move.w RIGHTUVS-LEFTUVS(a0),d7
- ; swap d7
- ; clr.w d7
- move.w (a0)+,d7
- ; swap d5
- ; clr.w d5
- ; sub.l d5,d7
- ; divs.l d0,d7
- ; move.l d7,a6
-
- move.w RIGHTUVS-LEFTUVS(a0),d7
- swap d7
- clr.w d7
- move.w (a0)+,d6
- swap d6
- clr.w d6
- sub.l d6,d7
- divs.l d0,d7
-
- lsl.l #8,d6
- lsl.l #8,d7
-
- move.w RIGHTBRIGHT,d7
- move.l d7,a6
-
- move.l a0,-(a7)
- move.l d1,-(a7)
- move.l #TEXTURES,a0
- move.w TEXTUREADD,d7
- bge.s .okaddtes4
- and.w #$7fff,d7
- add.l #65536*4,a0
- .okaddtes4:
- ext.l d7
- ; add.l d7,d7
- asl.l #8,d7
- add.l d7,a0
- move.w #0,d7
-
- move.w LEFTBRIGHT,d6
-
-
- subq #1,d0
- swap d0
- move.w HIGHPOLY,d0
- swap d0
-
-
- ; d0=xdist
- ; d2=U a1=DU
- ; d3=V a4=DV
- ; d4=X a5=DX
- ; d5=Y a6=DY
- ; d6=Z a3=DZ
-
- ; d0= polynum : polynum : counter : counter
- ; d1= scratch : scratch : scratch : scratch
- ; d2= u : uacc : sv : svacc
- ; d3= v : v : vacc : vacc
- ; d4= x : x : xacc : xacc
- ; d5= su : su : suacc : suacc
- ; d6= z : zacc : bright : brightacc
- ; d7= scratch : scratch : scratch : scratch
-
- ; a0= textures
- ; a1= uspeed : uspeed : suspeed : suspeed
- ; a2= screen pointer
- ; a3= svspeed : svspeed : svspeed : svspeed
- ; a4= vspeed : vspeed : vspeed : vspeed
- ; a5= xspeed : xspeed : xspeed : xspeed
- ; a6= zspeed : zspeed :brightspeed : brightspeed
- ; a7= shadowmap pointer
-
- move.w d2,-(a7)
- move.l d5,-(a7)
- move.l a3,-(a7)
-
- move.w #0,d2
- move.l #0,d5
- move.l #0,a3
-
- move.w FIRSTLEN,d0
- subq #1,d0
- bsr STARTLINE
-
-
- move.l (a7)+,a3
- move.l (a7)+,d5
- move.w (a7)+,d2
-
- move.w LASTLEN,d0
- subq #1,d0
-
- bsr STARTLINE
-
-
- move.l (a7)+,d1
- move.l (a7)+,a0
- move.l (a7)+,a2
-
- bra .noline
-
-
- .bothaway:
-
- move.w #0,6+RIGHTUVS-LEFTUVS(a0)
- move.w #0,6(a0)
-
- .bothtowards:
-
- ifne PH
- tst.w 16+RIGHTUVS-LEFTUVS(a0)
- blt.s .okone
- tst.w 16(a0)
- blt.s .okone
-
- move.w #0,2(a0)
- move.w #0,2+RIGHTUVS-LEFTUVS(a0)
- move.w #0,14(a0)
- move.w #0,14+RIGHTUVS-LEFTUVS(a0)
-
- .okone:
- endc
-
- move.l RIGHTUVS-LEFTUVS(a0),d7
- move.l (a0)+,d2
-
- and.l #$ffffff,d2
- and.l #$ffffff,d7
-
- moveq #0,d3
- moveq #0,d5
- move.w d2,d3
- move.w d7,d5
- swap d3
- swap d5
- sub.l d3,d5
- divs.l d0,d5
- asr.l #8,d5
- move.w d5,RIGHTBRIGHT
- asr.l #8,d3
- move.w d3,LEFTBRIGHT
-
- clr.w d2
- clr.w d7
- sub.l d2,d7
- asl.l #8,d2
- divs.l d0,d7
- asl.l #8,d7
-
- move.l RIGHTUVS-LEFTUVS(a0),d6
- move.l (a0)+,d3
-
- moveq #0,d4
- moveq #0,d5
-
- move.w d6,d5
- move.w d3,d4
- move.b #0,d4
- move.b #0,d5
-
- sub.l d4,d5
- divs.l d0,d5
-
- move.w d4,d2
- move.w d5,d7
- move.l d7,a1
- moveq #0,d4
- moveq #0,d5
-
- move.b d6,d5
- move.b d3,d4
-
- swap d5
- swap d4
-
- sub.l d4,d5
- divs.l d0,d5
-
- move.l d5,a3
- move.l d4,d5
-
-
- clr.w d3
- clr.w d6
- sub.l d3,d6
- divs.l d0,d6
-
- asr.l #8,d3 ; XX XX vpos vacc
- asr.l #8,d6 ; XX XX vspeed vspeed
-
- ; move.l d6,a4
-
- move.w RIGHTUVS-LEFTUVS(a0),d7
- move.w (a0)+,d4
- swap d7
- clr.w d7
- swap d4
- clr.w d4
- sub.l d4,d7
- divs.l d0,d7
- asl.l #8,d4
- asl.l #8,d7
- move.w d3,d4
- move.w d6,d7
- move.l d7,a5
-
- ; move.w RIGHTUVS-LEFTUVS(a0),d7
- ; swap d7
- ; clr.w d7
- move.w (a0)+,d7
- ; swap d5
- ; clr.w d5
- ; sub.l d5,d7
- ; divs.l d0,d7
- ; move.l d7,a6
-
- move.w RIGHTUVS-LEFTUVS(a0),d7
- swap d7
- clr.w d7
- move.w (a0)+,d6
- swap d6
- clr.w d6
- sub.l d6,d7
- divs.l d0,d7
-
- lsl.l #8,d6
- lsl.l #8,d7
-
- move.w RIGHTBRIGHT,d7
- move.l d7,a6
-
- moveq #0,d7
- moveq #0,d3
- move.w RIGHTUVS-LEFTUVS(a0),d7
- move.w (a0)+,d3
-
- addq #2,a0
-
- sub.w d3,d7
- swap d3
- swap d7
- divs.l d0,d7
-
- move.l d7,a4
-
-
- move.l a0,-(a7)
- move.l d1,-(a7)
- move.l #TEXTURES,a0
- move.w TEXTUREADD,d7
- bge.s .okaddtes5
- and.w #$7fff,d7
- add.l #65536*4,a0
- .okaddtes5:
- ext.l d7
- asl.l #8,d7
- add.l d7,a0
- move.w #0,d7
-
- move.w LEFTBRIGHT,d6
-
- subq #1,d0
- swap d0
- move.w HIGHPOLY,d0
- swap d0
-
-
- ; d0=xdist
- ; d2=U a1=DU
- ; d3=V a4=DV
- ; d4=X a5=DX
- ; d5=Y a6=DY
- ; d6=Z a3=DZ
-
- ; d0= polynum : polynum : counter : counter
- ; d1= scratch : scratch : scratch : scratch
- ; d2= u : uacc : sv : svacc
- ; d3= pxpos : pxpos : pxacc : pxacc
- ; d4= x : xacc : v : vacc
- ; d5= su : su : suacc : suacc
- ; d6= z : zacc : pypos : pyacc
- ; d7= scratch : scratch : scratch : scratch
-
- ; a0= textures
- ; a1= uspeed : uspeed : suspeed : suspeed
- ; a2= screen pointer
- ; a3= svspeed : svspeed : svspeed : svspeed
- ; a4= pxspd : pxspd : pxspd : pxspd
- ; a5= xspeed : xspeed : vspeed : vspeed
- ; a6= zspeed : zspeed : pyspeed : pyspeed
- ; a7= shadowmap pointer
-
- bsr STARTLINE
-
- move.l (a7)+,d1
- move.l (a7)+,a0
- move.l (a7)+,a2
-
- .noline:
- add.w #320,a2
-
- swap d1
- dbra d1,DOAHORLINEGOUR
-
- bra NOPOLYGON
-
-
-
-
-
- *******************************
- STARTLINE:
-
- move.l a7,SAVESTACK
- move.l #SHADOWBUFFER,a7
-
- moveq #0,d1
- swap d6
- move.w d6,d1
- move.l d4,d7
- swap d7
- lsr.w #8,d7
- move.b d7,d1
- swap d6
-
- swap d0
- moveq #0,d7
- move.b (a7,d1.l*2),d7
- cmp.w d7,d0
- ble .startlight
- swap d0
- bra INTHEDARKGOUR
- .startlight:
- swap d0
- bra INTHELIGHTGOUR
- .startdark:
- ***********************************
-
-
-
- PENUMBRAGOUR:
- moveq #0,d1
- swap d6
- move.w d6,d1
- move.l d4,d7
- lsr.l #8,d7
- swap d7
- move.b d7,d1
- swap d6
- add.l a5,d4
- add.l a6,d6
- add.l a3,d5
-
- swap d0
- moveq #0,d7
- move.b (a7,d1.l*2),d7
- cmp.w d7,d0
- ifne SHADOWMAP
- ble INTOLIGHTGOUR
- endc
- ifeq SHADOWMAP
- bra INTOLIGHTGOUR
- endc
- bra.s INTODARKGOUR
-
- INTHEDARKGOUR:
- moveq #0,d1
- swap d6
- move.w d6,d1
- move.l d4,d7
- swap d7
- asr.w #8,d7
- move.b d7,d1
- swap d6
- add.l a5,d4
- add.l a6,d6
- add.l a3,d5
-
- swap d0
- moveq #0,d7
- move.b (a7,d1.l*2),d7
- cmp.w d7,d0
- ifne SHADOWMAP
- ble.s INTOPENUMGOUR
- endc
- ifeq SHADOWMAP
- bra INTOLIGHTGOUR
- endc
- INTODARKGOUR:
- swap d0
-
- ;**********************
- ; moveq #0,d7
- ;**********************
-
- swap d2
- move.w d2,d1
- move.w d4,d7
- lsr.w #8,d7
- move.b d7,d1
- swap d2
- add.l a1,d2
- add.l a4,d3
-
- move.l #(31*32*256),d7
- move.b 1(a0,d1.w*4),d7
- bra DARKplottt
-
- .noplottt
- addq #1,a2
- dbra d0,INTHEDARKGOUR
- bra DONEDONEBUM
-
- INTOPENUMGOUR:
- swap d0
-
- *********************
- ; moveq #0,d7
- *****************
-
- swap d2
- move.w d2,d1
- move.w d4,d7
- lsr.w #8,d7
- move.b d7,d1
- swap d2
- add.l a1,d2
- add.l a4,d3
-
- move.l (a0,d1.w*4),d1
- moveq #0,d7
- move.w d6,d7
- swap d3
- move.b d3,d7
- add.w d1,d7
- swap d3
-
- move.b 1(a7,d7.l*2),d7
- lsl.w #8,d7
-
- ; sub.w #$1c00,d7
- asr.w #1,d7
- ; add.w #$1c00,d7
- neg.w d7
- add.w #$1f00,d7
- sub.b d7,d7
-
- asl.l #5,d7
- swap d1
- move.b d1,d7
-
-
- bra.s PENUMplottt
-
- .noplottt
- addq #1,a2
- dbra d0,PENUMBRAGOUR
- bra DONEDONEBUM
-
-
- INTHELIGHTGOUR:
-
- moveq #0,d1
- swap d6
- move.w d6,d1
- move.l d4,d7
- swap d7
- lsr.w #8,d7
- move.b d7,d1
- swap d6
- add.l a5,d4
- add.l a6,d6
- add.l a3,d5
-
- swap d0
- moveq #0,d7
- move.b (a7,d1.l*2),d7
- cmp.w d7,d0
-
-
- ifne SHADOWMAP
- bgt.s INTOPENUMGOUR
- endc
-
- INTOLIGHTGOUR:
- swap d0
-
- swap d2
- move.w d2,d1
- move.w d4,d7
- asr.w #8,d7
- move.b d7,d1
- swap d2
-
- move.l (a0,d1.w*4),d1 ; SPEC COL OFX OFY
-
- add.l a1,d2
- add.l a4,d3
-
- bra.s LIGHTPLOTT
- .noplottt:
- addq #1,a2
- dbra d0,INTHELIGHTGOUR
- FLIBBLEY:
- bra.s DONEDONEBUM
-
- PENUMplottt
- move.b GOURPAL(pc,d7.l),(a2)+
- dbra d0,PENUMBRAGOUR
- bra.s DONEDONEBUM
-
- DARKplottt
- move.b GOURPAL(pc,d7.l),(a2)+
- dbra d0,INTHEDARKGOUR
- bra.s DONEDONEBUM
-
- LIGHTPLOTT:
- moveq #0,d7
-
- move.w d2,d7
- swap d5
- move.b d5,d7
- swap d5
-
- ifne BUMPSPEC
- add.w d1,d7 ; coord in spec map
- endc
-
- swap d1
- ifeq SPECMAP
- and.w #$ff,d1
- endc
-
- move.b 1(a7,d7.l*2),d7 ; specular value of point.
- lsl.w #8,d7
-
- ifne SPECULAR
- add.w d7,d1
- endc
-
- ifeq SPECULAR
- tst.w d1
- endc
-
- bgt.s .okshiney
- and.w #$ff,d1
- .okshiney
-
- move.w d6,d7
- swap d3
- move.b d3,d7
- swap d1
-
- ifne BUMPPHONG
- add.w d1,d7
- endc
-
- clr.w d1
- swap d1
- move.b 1(a7,d7.l*2),d7 ; brightness of point
- neg.b d7
- add.b #31,d7
- and.w #$ff,d7
- swap d7
- lsr.l #3,d7
- swap d3
- add.l d7,d1
-
- move.b GOURPAL(pc,d1.l),(a2)+
- dbra d0,INTHELIGHTGOUR
- DONEDONEBUM:
- move.l SAVESTACK,a7
- rts
-
- GOURPAL: incbin "ab3:includes/bigshadow.pal"
-
-
-
-
- LEFTSHINEV: dc.l 0
- RIGHTSHINEV: dc.l 0
- LEFTSHINEU: dc.l 0
- RIGHTSHINEU: dc.l 0
-
- TOPPTR: dc.l 0
- TOPPTNUM: dc.w 0
- BOTPTNUM: dc.w 0
- LEFTBRIGHT: dc.w 0
- RIGHTBRIGHT: dc.l 0
- LEFTSPEC: dc.w 0
- RIGHTSPEC: dc.w 0
-
- ***********************************************
-
- SIMPLECALCLINE:
- move.l #ONSCREENPTS,a1
-
- move.w 2(a1,d0.w*4),d2 ;fy
- move.w 2(a1,d1.w*4),d7 ;sy
-
- move.l #RIGHTUVS,a3
- asr.w #2,d2
- asr.w #2,d7
- cmp.w d2,d7
- beq .noline
-
- bgt.s .lineonright
- .lineonleft:
- move.l #LEFTUVS,a3
- exg d0,d1
- exg d2,d7
-
- .lineonright:
- move.w d0,TOPPTNUM
- move.w d1,BOTPTNUM
-
- sub.w d2,d7
- move.w d2,d3
- muls #20,d3
- asl.w #4,d2
- add.w d3,a3
- move.l a3,TOPPTR
-
- move.w d7,YDIFF
-
- move.w (a1,d0.w*4),d3 ;fx
- move.w (a1,d1.w*4),d7 ;sx
-
- sub.w d3,d7
- swap d3
- swap d7
- clr.w d3
- clr.w d7
- divs.l YDIFF-2,d7
- move.l d7,a0 ; dx
-
- move.l #UVCOORDS,a2
- move.l #SHADOWPTS,a1
-
- move.w (a2,d0.w*4),d4
- move.w 2(a2,d0.w*4),d5
- move.w (a2,d1.w*4),d6
- move.w 2(a2,d1.w*4),d7
-
- sub.w d4,d6
- sub.w d5,d7
- swap d4
- swap d5
- clr.w d4
- clr.w d5
- swap d6
- swap d7
- clr.w d6
- clr.w d7
-
- divs.l YDIFF-2,d6
- divs.l YDIFF-2,d7
-
- move.l d6,a4
- move.l d7,a5
-
- muls #10,d0
- muls #10,d1
- move.l (a1,d0.w),d6
-
- move.l (a1,d1.w),d7
- asl.l #5,d6
- asl.l #5,d7
- sub.l d6,d7
- divs.l YDIFF-2,d7
- move.l d7,a2
- move.l d6,a6
-
- move.l 4(a1,d0.w),d6
- move.l 4(a1,d1.w),d7
- asl.l #5,d6
- asl.l #5,d7
- sub.l d6,d7
- divs.l YDIFF-2,d7
- exg d7,a6
- exg d7,d6
-
- move.w 8(a1,d0.w),d0
- move.w 8(a1,d1.w),d1
- swap d0
- swap d1
- clr.w d0
- clr.w d1
- asr.l #2,d0
- asr.l #2,d1
- sub.l d0,d1
- divs.l YDIFF-2,d1
- move.l d1,a1
- move.l YDIFF-2,d1
- subq #1,d1
-
- ; d3=sx a0=dsx
- ; d4=u a4=du
- ; d5=v a5=dv
- ; d6=x a2=dx
- ; d7=y a6=dy
- ; d0=z a1=dz
- ; d1=dsy
-
-
- add.l #128*65536,d6
- add.l #128*65536,d7
- add.l #128*65536,d0
-
- .PUTINLINE:
- swap d3
- move.w d3,(a3)+
- swap d3
- add.l a0,d3
- move.l d4,(a3)+
- add.l a4,d4
- move.l d5,(a3)+
- swap d6
- add.l a5,d5
- move.w d6,(a3)+
- swap d6
- swap d7
- add.l a2,d6
- move.w d7,(a3)+
- swap d7
- swap d0
- add.l a6,d7
- move.w d0,(a3)+
- addq #4,a3
- swap d0
- add.l a1,d0
- dbra d1,.PUTINLINE
-
- tst.b Gouraud
- beq .noline
-
- move.w TOPPTNUM,d0
- move.w BOTPTNUM,d1
- move.l TOPPTR,a3
- moveq #0,d6
- move.w YDIFF,d6
-
- move.l #SPECBRIGHTS,a2
-
- moveq #0,d2
- moveq #0,d3
- move.b (a2,d0.w*4),d2
- move.b 1(a2,d0.w*4),d3
- sub.w #128,d2
- sub.w #128,d3
-
- move.w d2,d4
- move.w d3,d5
- muls ACOS,d2
- muls ASIN,d3
- sub.l d3,d2
- muls ASIN,d4
- muls ACOS,d5
- add.l d5,d4
- asl.l #2,d2
- swap d2
- asl.l #2,d4
- swap d4
-
- add.w #128,d2
- add.w #128,d4
- move.w d2,FSX
- move.w d4,FSY
-
- moveq #0,d2
- moveq #0,d3
- move.b (a2,d1.w*4),d2
- move.b 1(a2,d1.w*4),d3
- sub.w #128,d2
- sub.w #128,d3
-
- move.w d2,d4
- move.w d3,d5
- muls ACOS,d2
- muls ASIN,d3
- sub.l d3,d2
- muls ASIN,d4
- muls ACOS,d5
- add.l d5,d4
- asl.l #2,d2
- swap d2
- asl.l #2,d4
- swap d4
-
- add.w #128,d2
- add.w #128,d4
- move.w d2,SSX
- move.w d4,SSY
-
-
- move.w 2(a2,d0.w*4),d2
- move.w 2(a2,d1.w*4),d3
-
- asr.w #4,d2
- asr.w #4,d3
-
- bra .bothtowards
-
- tst.w d2
- blt .firsttowards
- bgt.s .firstaway
-
- tst.w d3
- ble .bothtowards
- bra .bothaway
-
- .firstaway
- tst.w d3
- blt .sectowards
- bra .bothaway
-
- .firsttowards:
- tst.w d3
- ble .bothtowards
-
- ; First one is towards, the second away.
- ; Do the line in two bits: one heading
- ; from the first point to the rim, the
- ; other heading from the rim to the second
- ; point and flagged as behind.
-
- move.w d6,d7 ; total length to draw
- move.w d2,FIRSTY
- move.w d3,LASTY
-
- neg.w d2
- add.w d2,d3 ; total change in Y
-
- bra.s .onetowards
-
- .sectowards:
- move.w d6,d7 ; total length to draw
- move.w d2,FIRSTY
- move.w d3,LASTY
- neg.w d3
- add.w d2,d3
-
- .onetowards:
-
- muls d2,d6
- divs d3,d6 ; length of first bit of line.
-
- ext.l d6
- ext.l d7
-
- move.w d6,FIRSTLEN
- sub.l d6,d7
- move.w d7,LASTLEN
-
- add.l d7,d6
-
- move.w FIRSTY,d2
- move.w LASTY,d3
- swap d2
- clr.w d2
- swap d3
- clr.w d3
- sub.l d2,d3
- divs.l d6,d3
- move.l d3,a6
- move.l d2,d7
-
- moveq #0,d2
- moveq #0,d3
- moveq #0,d4
- moveq #0,d5
- move.b (a2,d0.w*4),d2
- move.b 1(a2,d0.w*4),d3
-
- move.w d2,FIRSTU
- move.w d3,FIRSTV
-
- move.w d2,d4
- move.w d3,d5
- sub.w #128,d2
- sub.w #128,d3
- muls d2,d2
- muls d3,d3
- add.l d3,d2
- jsr CALCSQROOT
-
- tst.w d2
- beq.s .nochng
-
- sub.w #128,d4
- sub.w #128,d5
- muls #127,d4
- muls #127,d5
- divs d2,d4
- divs d2,d5
- add.w #128,d4
- add.w #128,d5
-
- .nochng:
-
- move.w d4,MIDU
- move.w d5,MIDV
-
- move.b (a2,d1.w*4),d4
- move.b 1(a2,d1.w*4),d5
- move.w d4,SECU
- move.w d5,SECV
-
- ; move.w d4,d2
- ; move.w d5,d3
- ;
- ; sub.w #128,d2
- ; sub.w #128,d3
- ; muls d2,d2
- ; muls d3,d3
- ; add.l d3,d2
- ; jsr CALCSQROOT
- ;
- ; tst.w d2
- ; beq.s .nochng2
- ;
- ; sub.w #128,d4
- ; sub.w #128,d5
- ; muls #127,d4
- ; muls #127,d5
- ; divs d2,d4
- ; divs d2,d5
- ; add.w #128,d4
- ; add.w #128,d5
- ;
- ;.nochng2:
- ;
- ; add.w MIDU,d4
- ; add.w MIDV,d5
- ; asr.w #1,d4
- ; asr.w #1,d5
- ; move.w d4,MIDU
- ; move.w d4,MIDV
-
- move.l #NORMBRIGHTS,a2
- move.w (a2,d0.w*2),d0
- move.w (a2,d1.w*2),d1
-
- sub.w d0,d1
- swap d1
- swap d0
- divs.l d6,d1
-
- move.w FIRSTLEN,d6
- beq.s .nofirstbit
- ext.l d6
-
- moveq #0,d2
- moveq #0,d3
- moveq #0,d4
- moveq #0,d5
- move.w FIRSTU,d2
- move.w MIDU,d3
- move.w FIRSTV,d4
- move.w MIDV,d5
-
- sub.w d2,d3
- swap d2
- swap d3
- divs.l d6,d3
- move.l d3,a4
-
- sub.w d4,d5
- swap d4
- swap d5
- divs.l d6,d5
- move.l d5,a5
-
- bsr DOABITOFLINE
- .nofirstbit:
-
- move.w LASTLEN,d6
- beq.s .nosecbit
- ext.l d6
-
- moveq #0,d2
- moveq #0,d3
- moveq #0,d4
- moveq #0,d5
- move.w MIDU,d2
- move.w SECU,d3
- move.w MIDV,d4
- move.w SECV,d5
-
- sub.w d2,d3
- swap d2
- swap d3
- divs.l d6,d3
- move.l d3,a4
-
- sub.w d4,d5
- swap d4
- swap d5
- divs.l d6,d5
- move.l d5,a5
-
- bsr DOABITOFLINE
- .nosecbit:
-
- bra .noline
-
- .bothaway
-
- ; Both are away, so do it simply.
-
- .bothtowards:
-
- ; Both are towards, so do it simply and flag all
- ; points as towards.
-
- swap d2
- clr.w d2
- swap d3
- clr.w d3
- sub.l d2,d3
- divs.l d6,d3
- move.l d3,a6
- move.l d2,d7
-
- moveq #0,d2
- moveq #0,d3
- moveq #0,d4
- moveq #0,d5
- ; move.b (a2,d0.w*4),d2
- ; move.b (a2,d1.w*4),d3
- ; move.b 1(a2,d0.w*4),d4
- ; move.b 1(a2,d1.w*4),d5
-
- move.w FSX,d2
- move.w SSX,d3
- move.w FSY,d4
- move.w SSY,d5
-
- sub.w d2,d3
- swap d2
- swap d3
- divs.l d6,d3
- move.l d3,a4
-
- sub.w d4,d5
- swap d4
- swap d5
- divs.l d6,d5
- move.l d5,a5
-
- move.l #NORMBRIGHTS,a2
- movem.l d2/d4,-(a7)
-
- moveq #0,d2
- moveq #0,d3
- move.b (a2,d0.w*2),d2
- move.b 1(a2,d0.w*2),d3
- sub.w #128,d2
- sub.w #128,d3
-
- move.w d2,d4
- move.w d3,d5
- muls ACOS,d2
- muls ASIN,d3
- sub.l d3,d2
- muls ASIN,d4
- muls ACOS,d5
- add.l d5,d4
- asl.l #2,d2
- swap d2
- asl.l #2,d4
- swap d4
-
- add.w #128,d2
- add.w #128,d4
- move.w d2,FSX
- move.w d4,FSY
-
- moveq #0,d2
- moveq #0,d3
- move.b (a2,d1.w*2),d2
- move.b 1(a2,d1.w*2),d3
- sub.w #128,d2
- sub.w #128,d3
-
- move.w d2,d4
- move.w d3,d5
- muls ACOS,d2
- muls ASIN,d3
- sub.l d3,d2
- muls ASIN,d4
- muls ACOS,d5
- add.l d5,d4
- asl.l #2,d2
- swap d2
- asl.l #2,d4
- swap d4
-
- add.w #128,d2
- add.w #128,d4
- move.w d2,SSX
- move.w d4,SSY
-
- moveq #0,d0
- moveq #0,d1
- moveq #0,d3
- moveq #0,d5
-
- move.w FSY,d3
- move.w SSY,d5
- move.w FSX,d0
- move.w SSX,d1
-
- ext.l d0
- ext.l d1
- sub.w d0,d1
- swap d1
- swap d0
- divs.l d6,d1
-
- ext.l d3
- ext.l d5
- sub.w d3,d5
- swap d5
- swap d3
- divs.l d6,d5
-
- movem.l (a7)+,d2/d4
-
- move.l d6,-(a7)
- bsr DOABITOFLINE
- move.l (a7)+,d6
-
- move.w TOPPTNUM,d0
- move.w BOTPTNUM,d1
- move.l TOPPTR,a3
- move.l #NORMVECTS,a2
- muls #6,d0
- muls #6,d1
- moveq #0,d2
- moveq #0,d3
- move.w 2(a2,d0.w),d2 ; firsty
- move.w 2(a2,d1.w),d3 ; secy
- sub.w d2,d3
- swap d3
- swap d2
- divs.l d6,d3
-
- subq #1,d6
- .stickiny
- swap d2
- move.w d2,18(a3)
- swap d2
- add.l d3,d2
- add.w #20,a3
- dbra d6,.stickiny
-
- .noline:
- rts
-
- DOABITOFLINE:
- subq #1,d6
-
- .STICKINGOUR:
- swap d7
- move.b d7,2(a3)
- swap d7
- add.l a6,d7
- swap d0
- move.w d0,4(a3)
- swap d0
- add.l d1,d0
- swap d2
- move.b d2,8(a3)
- swap d4
- move.b d4,9(a3)
- swap d4
- swap d3
- move.w d3,16(a3)
- swap d3
- add.l d5,d3
-
- adda.w #20,a3
- swap d2
- add.l a4,d2
- add.l a5,d4
- dbra d6,.STICKINGOUR
-
- rts
-
- FIRSTY: dc.w 0
- LASTY: dc.w 0
- FIRSTU: dc.w 0
- SECU: dc.w 0
- FIRSTV: dc.w 0
- SECV: dc.w 0
- dc.w 0
- FIRSTLEN: dc.w 0
- dc.w 0
- LASTLEN: dc.w 0
- MIDU: dc.w 0
- MIDV: dc.w 0
-
- *!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-
-
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
- ************************************************
-
- move.w d3,TOPLINE
- move.w d4,BOTLINE
-
-
-
-
- *********************************************
-
- CALCSQROOT:
- tst.l d2
- beq .oksqr
-
- movem.l d0/d1/d3-d7/a0-a6,-(a7)
-
- move.w #31,d0
- .findhigh
- btst d0,d2
- bne .foundhigh
- dbra d0,.findhigh
- .foundhigh
- asr.w #1,d0
- clr.l d3
- bset d0,d3
- move.l d3,d0
-
- move.w d0,d1
- muls d1,d1 ; x*x
- sub.l d2,d1 ; x*x-a
- asr.l #1,d1 ; (x*x-a)/2
- divs d0,d1 ; (x*x-a)/2x
- sub.w d1,d0 ; second approx
- bgt .stillnot0
- move.w #1,d0
- .stillnot0
-
- move.w d0,d1
- muls d1,d1
- sub.l d2,d1
- asr.l #1,d1
- divs d0,d1
- sub.w d1,d0 ; second approx
- bgt .stillnot02
- move.w #1,d0
- .stillnot02
-
- move.w d0,d1
- muls d1,d1
- sub.l d2,d1
- asr.l #1,d1
- divs d0,d1
- sub.w d1,d0 ; second approx
- bgt .stillnot03
- move.w #1,d0
- .stillnot03
-
- move.w d0,d2
- ext.l d2
-
- movem.l (a7)+,d0/d1/d3-d7/a0-a6
-
- .oksqr
- rts
-
-
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- ********************** ************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
-
- TOPLINE: dc.w 0
- BOTLINE: dc.w 0
-
-
-
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
- **********************************************
-
-
-
- dc.w 0
- YDIFF: dc.w 0
-
- SPINAROUND: dc.w 0
- XCOS: dc.w 0
- YCOS: dc.w 0
- XSIN: dc.w 0
- YSIN: dc.w 0
- XCOS3: dc.w 0
- YCOS3: dc.w 0
- XSIN3: dc.w 0
- YSIN3: dc.w 0
- XCOS2: dc.w 0
- YCOS2: dc.w 0
- XSIN2: dc.w 0
- YSIN2: dc.w 0
- XADD: dc.l 0
- YADD: dc.l 0
- ZADD: dc.l 0
- XOFF: dc.w 0
- YOFF: dc.w 0
- OLDXM: dc.w 0
- OLDYM: dc.w 0
-
-
-
- TEXTUREADD: dc.w 0
-
-
- **********************************************************
-
- UVCOORDS: ds.l 250
- ROTATEDPTS: ds.l 250*4
- SHADOWPTS: ds.l 250*4
- ONSCREENPTS: ds.l 250
-
- ZOFF:
- ifeq LARGESCREEN
- dc.w 768
- endc
- ifne LARGESCREEN
- dc.w 300
- endc
-
- LEFTRIGHT: ds.l 256
-
- POLYGONDATA:
- ds.b 30000
-
- OBJNAME: dc.b "ab3:vectobj/testcube",0
- even
- doslibname: dc.b 'dos.library',0
- even
- doslib: dc.l 0
-
- ****************************
-
- SINETABLE:
- incbin "ab3:includes/bigsine"
-
-
- YANG: dc.w 0
- XANG: dc.w 0
-
-
- xmouse: dc.w 0
- ymouse: dc.w 0
-
- spleen: dc.w 0
- lastspleen: dc.w 0
-
- COPIEDPAL:
- dc.w 256,0
- ds.l 3*256
- ds.l 10
-
- SHADOWBUFFER:
- HIGHLIGHT: incbin "work:temp/HIGHLIGHT"
-
- PALETTEBIT:
- ; incbin "256palette"
- ; dc.w $ffff,$fffe
-
- incbin "ab3:shadowtex/shadowpal"
-
- include "ab3:source_4000/chunky.s"
-
- willy: ds.w 48
-
-
- PALS:
- ds.l 2*49
-
- pregour: dc.b 0
- Gouraud: dc.b 0
-
- PointAngPtr: dc.l 0
- FRAMENUM: dc.w 0
- PolyAngPtr: dc.l 0
- PtsPtr: dc.l 0
- LinesPtr: dc.l 0
- POINTER_TO_POINTERS: dc.l 0
- FRAME: dc.w 4
- FLIBBLE: dc.w 0
- START_OF_OBJECT: dc.l 0
- num_points: dc.w 0
- num_frames: dc.w 0
- SORTIT: dc.w 0
- PartBuffer: ds.l 2*32
- endparttab:
-
- x1: dc.w 0
- y1: dc.w 0
- z1: dc.w 0
- x2: dc.w 0
- y2: dc.w 0
- z2: dc.w 0
- x2b: dc.w 0
- y2b: dc.w 0
- z2b: dc.w 0
-
- x3: dc.w 0
- y3: dc.w 0
- z3: dc.w 0
-
- l1: dc.w 0
- l2: dc.w 0
-
- OBJONOFF: dc.l 0
-
- SAVEHIGHS: ds.w 30
-
- FASTBUFFER:
- dc.l fasty
-
- DS.B 64*256
- fasty: ds.b 320*256
- ds.b 64*256
-
- ifne MOTIONBLUR
- fasty2:
- ds.b 320*256
- endc
-
- NORMBRIGHTS: ds.w 250
-
- SPECBRIGHTS:
- dcb.l 100,31
-
- ENDNORM:
-
- LEFTUVS: ds.w 10*256
- RIGHTUVS: ds.w 10*256
-
- NORMVECTS: ds.w 3*250
-
- ;WORLD: incbin "ab3:includes/world"
-
- ;TWEEN: incbin "ab3:includes/tweenbrightfile"
-
-
-
- NEBBIE: incbin "work:temp/nebbieroar"
- ds.l (192/4)*16
-
- SECTION blib,code_f
-
- TEXTURES:
- incbin "ab3:shadowtex/shadowmaps"
- even
-
- BLUR:
- ifne MOTIONBLUR
- incbin "ab3:shadowtex/blurfile"
- endc
-
- Font: dc.l fontplace
-
- fontplace: incbin "ab3:XENFONT.bin"
-
- SECTION BGDROP,code_c
-
- RAWSCRN:
- ds.l 2560*8
-